C语言文件读写

这里我会写C语言如何创建,打开,关闭,文本文件或二进制文件。

打开文件

对于打开文件,我们用 fopen函数来打开一个文件。

1
2
FILE   *fp;//定义一个文件指针
fp = fopen(filename,mode);

下面的是fopen函数的函数原型;

1
FILE *fopen( const char * filename, const char * mode );

在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

模式 描述
r 打开一个已有的文本文件,运行读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件,如果文件不存在,则会创建一个新文件。在这里您的程序会在已有的文件内容中追加内容。
r+ 打开一个文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已经存在,则会被截断问零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需要使用下面的访问模式来取代上面的访问模式:

“rb”,”wb”,”ab”,”rb+”,”wb+”,”w+b”,”ab+”,”a+b”

关闭文件

关闭文件的函数为fclose()。函数原型为下:

1
int fclose (File *fp);

如果成功关闭文件,fclose()函数返回为零,如果关闭文件时发生错误,函数返回EOF。这个函数实际上,会清空缓冲区的数据,关闭文件,并释放用于该文件的所有内存。

写入文件

  • 字符的读写:使用fgetc()函数和fputc()函数;
  • 字符串的读写:使用fgets()函数和fputs()函数;
  • 格式化的读写(主要用于文本文件):使用fscanf()函数和fprintf()函数;
  • 二进制文件的读写:使用fwrite()函数和fread()函数和fseek函数。

字符读写

1.fputc()函数

1
fputc(c,fp);//用于将一个字符写入文件

其中,fp为文件指针变量;c为要写入的字符,可以是字符常量或字符型变量。函数成功执行返回写入的字符;否则返回EOF。

2.fgetc()函数

1
c =  fgetc(fp);//用来从指定的文本文件中读取一个字符

其中,fp为文件指针,c为要写入的字符。该函数的功能是从指定的文件中读取一个字符,并赋值给字符型变量c。

函数成功读取,返回读取字符;读取错误或者遇到结束标志EOF,返回EOF。

字符串读写

1.fputs()函数

1
fputs(s,fp);//用来将一个字符串写入指定的文本文件。

其中,fp为文件指针,s可以是字符数组名,字符型指针变量或字符串常量。该函数的功能是将字符串s写入由fp指向的文件中,字符串末尾“\0”字符不允许写入。

函数范湖值:执行成功,返回所写入的最后一个字符;否则,返回EOF。

2.fgets()函数

1
fgets(s,n,fp);//用于从指定的文件中读取一个字符串到字符数组中。

其中,s可以是字符型数组名或字符串指针;n是指定读入的字符个数;fp为文件指针。n是一个正整数,表示从文件中最多读取n-1个字符,并将字符串指针s定位在读入的字符串首地址。

fgets()函数从文件中读取字符直到遇到回车符或EOF为止,函数会在最后一个字符后加上字符串结束标志’\0’;若有EOF,则不予保留。

函数返回值:该函数如果执行成功,返回读取字符串;如果失败,则返回空指针NULL,这时,s中的内容不确定。格式化读写

格式化读写

1. fprintf()函数

1
fprintf(fp,format,arg1,arg2,...,argn);

fprintf函数用来将输出项按指定的文本文件中,其中格式化规定与printf()函数功能相似,所不同的只是fprintf()函数是将输出的内容写入文件中,而printf()则是在屏幕输出。

其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输出项,可以是字符、 字符串或各种类型的数值。该函数的功能是按格式控制字符串format给定的格式,将输出项arg1,arg2,……,argn的值写入fp所指向的文件中。

函数返回值:如果函数执行成功,返回实际写入文件的字符个数;若出现错误,返回负数。

具体格式:

1
fprintf(fp,"%s",s[i]);      //在文件中写入数组中的字符串

2.fscanf()函数

1
fscanf(fp,format,arg1,arg2,...,argn);

fscanf()用来按规定的格式从指定的文本文件中读取数据。它与scanf()函数的功能相似,都是按规定的格式读数据的函数,只是fscanf()函数读的对象不是键盘区,而是文件。

其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输入项的地址。该函数的功能是从文件指针fp所指的文本文件中读取数据,按格式控制字符串format给定的格式赋予输入项arg1,arg2,……,argn中。

函数返回值:如果该函数执行成功,返回读取项目个数;如果遇到文件末尾,返回EOF;如果赋值失败,返回0.

具体格式:

1
fscanf(fp,"%s",s[i]);    //读取字符串存入数组

二进制文件的读写

1.fwrite()函数

1
fwrite(const viod *ptr,size , size_number,FILE *fp);

其中ptr为数组,size为长度,size_number为长度,fp为流文件指针。

从ptr指向的数组中将最多number个长度为size的元素写入fp指向的流中。若定义了流的文件位置指示符,则以成功写入的字符数为单位向前移动。当发生错误时,该流的文件位置指示符的值不可预测。

成功写入后返回写入的元素个数。写入错误也是返回写入个数。

具体格式:

1
fwrite(str,sizeof(int),2,fp);

2.fread()函数

1
fread(const void *ptr,size,size_number,FILE *fp);

ptr为一个指针,size为大小,size_number为长度,fp为文件指针。

从fp指向的流中最多读取number个长度为size的元素到ptr指向的数组。若定义了流的文件位置指示符,则以成功读取的字符数为单位向前移动。当发生错误时,该流的文件位置指示符的值不可预测。只读取到某一元素的部分内容时,值不可预测。

读取成功后返回成功读取的元素个数。当发生读取错误或达到文件末尾时,元素个数会少于nmemb。若size或nmemb为0,则返回0.这时数组内容和流的状态都不发生变化。

具体格式:

1
fread(str,sizeof(int),1,fp);

3.fseek()函数

1
fseek(FILE *fp,long offset,int fromwhere);

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

(1)stream:文件指针

(2) offset:为偏移量,正数表示正向偏移,负数表示负向偏移

(3) fromwhere:从文件的哪里开始偏移,可能取值为:SEEK_SET,SEEK_CUR、 SEEK_END (对应0 、 1 、 2)

具体格式:

1
fseek(fp , 100L,0);

其他有用的函数

feof()函数

1
feof(FILE *fp);

feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0(即,文件结束:返回非0值;文件未结束:返回0值)。

rewind()函数

1
rewind(FILE *fp);

使位置指针重新返回文件的开头。

ftell()函数

1
ftell(FILE *fp);

得到流式文件中的当前位置