详解文件操作
Posted 王不患吖吖吖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解文件操作相关的知识,希望对你有一定的参考价值。
什么是文件
- 程序文件
源程序文件.c 目标文件.obj 可执行文件.exe - 数据文件
就是指程序运行时要读取或者输出数据的文件
我们经常会把信息放在磁盘上,当需要的时候就把磁盘的数据读到内存中再使用,或者把信息输入到磁盘里边。这就是文件的操作。
文件类型
- 文本文件—例如整数10000,(一个字符占一个字节)它是以ACLL形式进行存储,内存中占有5个字节
- 二进制文件—还是10000,内存中以二进制存储 10 27 00 00,一个整数,占四个字节
文件指针
每一个被使用的文件都在内存中开辟了一个相应的文件信息区,这个信息区里边会存储文件的相关信息,例如文件状态,文件的当前位置,这些信息保存在一个结构体变量里边,结构体变量的类型由系统声明,为FILE
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
我们一般通过FILE的指针来维护这个结构体的变量。
FILE *pf;
每一个指针变量指向一个文件,
也就是说我们可以通过这个指针来操作相关的文件。
文件的打开与关闭
在操作某一个文件的时候我们先进行打开,然后一定要进行关闭
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。
FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );
其中有很多种打开方式
为什么要关闭文件
文件缓冲区
就是说程序数据向输入到磁盘中,要先输入到输出缓冲区,磁盘的文件要输出到程序数据区,要先把它输出到输入缓冲区。缓冲区的数据被装满才能进行下一步操作。如果我们不想让它装满才进行下一步操作。我们需要刷新缓冲区,或者关闭文件才行,所以我们要关闭文件。
一组函数
scanf/fscanf/sscanf
printf/fprintf/sprintf
scanf–从标准输入流(键盘)读取格式化的数据
fscanf–从所有的输入流读取格式化的数据
sscanf–读一个格式化的数据到字符串里边
printf–输入格式化的数据到标准输出流(屏幕)
fprintf–写一个格式化的数据到所有输入流
sprintf–写一个字符串数据到所有输出流
文件的随机读写
feek
根据文件指针的位置和偏移量来定位文件指针
int fseek ( FILE * stream, long int offset, int origin );
*steam 文件的指针
offset 偏移量(字节)
origin 初始位置
记住几个常用的
文件的开始位置,文件的当前指针,文件的结束
例子
定位文件指针然后可以替换里边的内容
ftell
返回文件的随机偏移量
long int ftell ( FILE * stream );
rewind
让文件指针回到文件的起始位置
void rewind(FILE *steam);
文件结束判定
feof
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
- 文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)
例如:
fgetc判断是否为EOF.
fgets判断返回值是否为NULL. - 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
正确的使用:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int c; // 注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
}
以上是关于详解文件操作的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程