C语言文件读写
C语言文件读写
这里我会写C语言如何创建,打开,关闭,文本文件或二进制文件。
打开文件
对于打开文件,我们用 fopen函数来打开一个文件。
1 | FILE *fp;//定义一个文件指针 |
下面的是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); |
得到流式文件中的当前位置