C语言文件添加内容

C语言文件添加内容,第1张

C语言中,通过文件打开函数fopen中的第二个参数,来设置打开模式。要在文件中添加内容,而不是重写,只需要设置a模式即可(append).

fopen的声明为

FILE * fopen(const char * name, const char *mode)

功能是打开文件名为name的文件,打开模式由mode指定。

当mode为

"a": 以追加方式打开。

"ab": 以追加方式打开二进制文件。

"ab+":以追加方式打开二进制文件,并可读。

"a+":以追加方式打开文件,并可读。

1、可以使用fseek()来指定文件位置

函数原型:int fseek(FILE *stream, long offset, int fromwhere)

函数说明:函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

返回值:如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。

2、例程:向test.txt的末尾添加“this is a text"的字符串。

  #include <stdio.h>

#include <string.h>

int main()

{

const char * szwrite = " this is a text"

FILE *fp = fopen("test.txt", "a+")

if (fp==0) {

printf("can't open file\n")

return 0

}

fseek(fp, 0,SEEK_END)

fwrite(szwrite, strlen(szwrite) * sizeof(char), 1, fp)

fclose(fp)

return 0

}

使用这几个函数。

int fseek (FILE *stream,long offset,int fromwhere)

long ftell(FILE *stream)

int rewind(FILE *stream)

可以实现在一个文件的任意位置添加信息。但除了在文件尾添加信息之外,你写将要插入位置后面的文件内容读到缓冲,然后定位文件偏移量插入数据,在将读出来的写入。

因为文件在磁盘上是连续存放的,不可能说直接在中间插入内容而不覆盖原来的,别的语言提供的都是自己按照上述思路写的。

例程:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <Windows.h>

/* 读出文件放到数组中,新增数据插入到该数组中;

   重新将数组中的数据写入该文件中

*/

void main(int argc,char * agrv)

{

    FILE *fp

    char name[20]       //输入变量

    int sum             //输入变量

    char fName[10][20]  //可存储10个人名

    int fScore[10]      //存储10个分数记录

    char buff1[20]

    char buff2[20]

    int i=0

    //打开存储文件

    if ((fp=fopen("c:\\scorelist.txt","r"))==NULL)

    {

        printf("Can not open the file")

        getch()

        exit(0)

    } 

    else

    {   

        while (!feof(fp))

        {   

            ZeroMemory(buff1,sizeof(buff1))       //清空内存

            ZeroMemory(buff2,sizeof(buff1))

            fgets(buff1,sizeof(buff1),fp)         //读取名称

            fgets(buff2,sizeof(buff2),fp)         //读取第二行分数

            if (strcmp(buff1,"")==0)

            {

                continue

            }

            else

            {

                strcpy(fName[i],buff1) 

                printf("%s",fName[i])                 //输出名称

                fScore[i] = atoi(buff2)                //将字符型转换成int型

                printf("%i\n",fScore[i])              //打印输出分数值

            }

            i++

        }

    }

    fclose(fp)

    //打开存储文件,将排好序的数据重新写入文件中

    if ((fp=fopen("c:\\scorelist.txt","w"))==NULL)

    {

        printf("Can not open the file")

        getch()

        exit(0)

    } 

    else

    {   

        printf("Input the new name:\n")

        scanf("%s",name)

        printf("Input the new score:\n")

        scanf("%i",&sum)

        int j =0

        //获取新增积分排序位置

        while(sum < fScore[j])

        {

             j++

        

        }

        //移动数据重新对数组排序,从后往前排序

        int m = i

        while (i>j)

        {

            strcpy(fName[i],fName[i-1])

            fScore[i] = fScore[i-1]

            i--

        }

        strcpy(fName[j],name)

        strcat(fName[j],"\n")

        fScore[j] = sum

        //写入文本文件

        int k=0

        while(k<=m)

        {

            fputs(fName[k],fp)

            fprintf(fp,"%i\n",fScore[k])

            k++

        }

    }    

    fclose(fp)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11473441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存