目录
文件指针:
“文件类型指针”又简称为“文件指针”,每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为:FILE
FILE* pf; //文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区,通过该文件信息区中的信息就能够访问该文件。
fopen、fclose函数的使用:
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
fopen:打开文件
FILE * fopen(const char * filename, const char * mode);
fclose:关闭文件
int fclose(FILE * stream);
具体使用:
int mian()
{
//打开文件,并对文件进行写入操作
FILE *pf = fopen("date.txt", "w");
//若未能正常打开文件,报错并返回
if (pf == NULL)
{
perror("fopen");
return 1;
}
//对文件进行操作
//…
//关闭文件,并将pf置为空指针
fclose(pf);
pf = NULL;
return 0;
}
顺序读写函数:
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入函数 | fread | 文件输入流 |
二进制输出函数 | fwrite | 文件输出流 |
字符输入/输出函数:
int fgetc(FILE * stream);
int fputc(int character, FILE * stream);
文本行输入/输出函数:
char * fgets(char * str, int num, FILE * stream);
int fputs(const char * str, FILE * stream);
格式化输入/输出函数:
int fscanf(FILE * stream, const char * format, ...);
int fprintf(FILE * stream, const char * format, ...);
二进制输入/输出函数:
size_t fread(void * ptr, size_t size, size_t count, FILE * stream);
size_t fwrite(const void * ptr, size_t size, size_t count, FILE * stream);
随机读写函数:
fseek:
根据文件指针的位置和偏移量来定位文件指针。
int fseek(FILE * stream, long int offset, int origin);
对于参数3的选项(即在文件中光标的起始位置)有三个选项:
1.SEEK_SET //文件的起始位置
2.SEEK_CUR //文件当前指针的位置
3.SEEK_END //文件的末尾
int main()
{
FILE * pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("Hello World.", pf);
//通过fseek函数用SEEK_SET将光标移动到6(W)的位置
fseek(pf, 6, SEEK_SET);
//改写文本文件
fputs("Hello", pf);
fclose(pf);
pf = NULL;
return 0;
}
编译完成后文本文件test.txt的内容(Hello World.)会被改换成(Hello Hello.)这就是通过fseek函数更改光标(指针)位置,然后对文件进行其他操作。
ftell:
返回文件指针相对于起始位置的偏移量
long int ftell(FILE * stream);
int main()
{
FILE * pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("Hello World.", pf);
//通过fseek函数将光标更改到6的位置
fseek(pf, 6, SEEK_SET);
//再通过ftell函数获取文件指针相对于起始位置(0)的偏移量
int ret = ftell(pf);
printf("%d\n", ret);//输出结果为6
fclose(pf);
pf = NULL;
return 0;
}
rewind:
让文件指针的位置回到文件的起始位置
void rewind(FILE * stream);
int main()
{
FILE * pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("Hello World.", pf);
//通过fseek函数将光标更改到6的位置
fseek(pf, 6, SEEK_SET);
//用rewind函数将光标位置回到文件起始位置
rewind(pf);
//通过ftell函数获取当前指针位置相对于起始位置的偏移量
int ret = ftell(pf);
printf("%d\n", ret);//输出结果为0
fclose(pf);
pf = NULL;
return 0;
}
文件读取结束判定的误区:
feof函数:
当文件读取结束的时候,判断是读取结束的原因是否是因为遇到文件末尾结束。
所以,在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
1.文本文件的读取:
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )。
2.二进制文件的读取
fread判断返回值是否小于实际要读的个数(对于fread函数来讲,要求读取num个大小为size字节的数据,如果真的读取到num个数据,函数返回num,如果没有读取到num个数据,返回的是真实的读取到的完整的数据个数)
ferror – 在文件读取结束后,用来判断文件是否因为在读取过程中遇到错误而结束!如果是,则返回一个非零的值
feof - 在文件读取结束后,用来判断文件是否因为在读取过程中遇到文件结束标志而结束!这种属于正常结束