知识储备:
知识点一:文件的类型可分为程序文件和文本文件(.txt),其中程序文件又可分为源文件(.c),目标文件(.obj),可执行性文件(.exe)。
知识点二:C程序在运行时会默认打开三个流,分别为标准输入流(stdin)、标准输出流(stdout)、标准错误流(stderr)。流可以理解为所有的设备输入和输出的数据汇聚成的流;这里打个比方:scanf这个函数完整的理解是从标准输入流中格式化输入数据,而printf完整的理解是从标准输出流中格式化输出数据。
知识点三:文件名=文件路径+文件名主干+文件后缀;
文件操作的流程:
打开文件:关键函数:fopen
FILE * fopen ( const char * filename, const char * mode );
该函数第一个参数为绝对文件名,可以在文件中的属性参看。第二个参数为操作类型例如:r,w。
注意文件操作的读和写是相对程序的流而言。例如读是从程序的流输入数据到文件中,而写则是从文件的流中写入数据到程序中;
返回的为一个FILE结构体类型的指针,FILE控制着一个文本信息区,文本信息区包含文件的地址,文件本,文件的内容;
读/写文件:使用不同的操作函数对指针进行操作,可以对文件实行不同的读和写,下面会具体介绍。
在文件操作前还需检验指针是否为空,如下:
#include<stdio.h>
int main()
{
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fclose(pf);
pf = NULL;
return 0;
}
关闭文件:关键函数:fclose
int fclose ( FILE * stream ); 记得野指针置空;
文件操作函数:
顺序读写:
1.字符输入函数:fgetc
int fgetc ( FILE * stream ); 该函数从流中读取一字符,适用于所有输入流,返回一个函数;
2.字符输出函数:fputc
int fputc ( int character, FILE * stream ); 该函数往流中添加一个字符,适用于所有输出流;
3.文本行输入函数:fgets
char * fgets ( char * str, int num, FILE * stream );该函数从流中提取一行总数为num的字符串,直到遇到\n结束,适用于所有输入流;
4.文本行输出函数:fputs
int fputs ( const char * str, FILE * stream );该函数往流中输入一行字符,多次操作自动换行,适用于所有输出流:
5.格式化输入函数:fscanf
int fscanf ( FILE * stream, const char * format, ... );该函数从输入流中提取不同样式的数据,适用于所有输入流;若此时输入流为标准输如流(Stdin),则相当于scanf;
6.格式化输出函数:fprintf
int fprintf ( FILE * stream, const char * format, ... );该函数往输出流中添加不同样式的数据,适用于所用输出流;若此时输出流为标准输出流(Stdout),则相当于printf;
7.二进制输入:fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );该函数从流stream中得到个数为count,大小为size的数据到ptr中,适用于文件,返回的是真实得到数据的个数;
注意此时fopen的mode参数为"rb";
8.二进制输出:fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );该函数从数据ptr中输入个数为count大小为size的数据到流stream中,返回的是真实输入数据的个数;
注意此时fopen的mode参数为"rw";
随机读写:
1.fseek 根据文件指针的位置和偏移量来定义文件指针;
int fseek ( FILE * stream, long int offset, int origin );
stream表示文件指针;offset表示偏移量,正数表示向右偏移,负数表示向左偏移;origin有三种状态,SEEK_SET表示文件的起始位置,SEEK_CUR表示文件指针的当前位置,SEEK_END表示文件的末尾位置;
2.ftell 返回文件指针相对于起始位置的偏移量;
long int ftell ( FILE * stream );
3.rewind 将文件指针回到文件的起始位置;
文件读取结束的判定
在文件读取的过程中不能用feof函数的返回值来判断文件的读取是否结束,feof的作用是当已经知道文件读取结束时,判断是否是因为遇到文件尾结束;、