目录
文件操作的流程:
①打开文件或者建立并且打开文件
②读取或者写入数据
③关闭文件
接下来就介绍一下c语言中一些常见的文件操作函数:
1.fopen()
①函数声明:FILE * fopen(const char * path,const char * mode)
②在调用fopen以后该函数会返回一个FILE*类型的指针,指向该文件(调用成功)。如果失败则会返回NULL;
③用法:fopen("目标文件路径.文件类型","文件使用方式");
如: 打开文件 "TEST.DAT" ,写下其目录 "C:\\TC\\TEST.DAT"
注意:如果将路径写成 "C:\TC\TEST.DAT" 是不正确的, 这一点要特别注意。
FILE*fp = fopen("C:\\TC\\TEST.DAT", "r");
fclose(fp);
文件使用方式 | 含义 | 如果指定文件不存在 |
"r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w"(只写) | 为了写入数据,打开一个文本文件 | 建立一个新的文本文件 |
"a"(追加) | 像文本文件尾添加数据 | 出错 |
"rb"(只读) | 为了读取数据,打开一个二进制文件 | 出错 |
"wb"(只写) | 为了写入数据,打开一个二进制文件 | 建立一个新的二进制文件 |
"ab"(追加) | 向一个二进制文件尾添加数据 | 出错 |
"r+"(读写) | 为了读和写打开一个文本文件 | 出错 |
"w+"(读写) | 为了读和写打建立一个新的文本文件 | 建立一个新的文本文件 |
”a+“(读写) | 打开一个文本文件,在文本文件尾进行读写 | 建立一个文本文件 |
"rb+"(读写) | 为了读和写,打开一个二进制文件 | 出错 |
"wb+"(读写) | 为了读和写,建立一个二进制文件 | 建立一个新二进制文件 |
"ab+"(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新二进制文件 |
注意:
- 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
- 若要向一个已存在的文本文件追加新的信息,只能用“a ”方式打开文件
- 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换
2.fclose()
①2. fclose()函数 fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为: nt fclose(FILE *stream);
②当文件关闭成功时, 返回0, 否则返回一个非零值。
③每当我们使用fopen()打开一个文件 进行操作以后,必须要记得关闭文件。
3.fwrite()
①原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr: ------------------------------- 指向需要被写入元素的地址
size_t :------------------------ 被写入元素的单个元素大小(以字节为单位)
nmemb-------------------------- 被写入的元素数量
stream -------------------------- 被写入的文件的文件指针(FILE*类型)(输出流)
② 返回值:该函数返回被写入的元素数量,该对象是一个整型数据类型。
③写入二进制文件
4.fread()
①函数原型: size_t fread( void *buffer, size_t size, size_t count, FILE *stream )
- buffer----------- 指向被写入到的取元素的地址
- size ------------- 被读取的单个元素大小(以字节为单位)
- count ---------- 被读取的元素数量
- strean -------- 被读取的文件的文件指针
②返回值:返回读取的元素个数
③fread可以读二进制文件,有时用字符方式去读文件不能读完整个文件,但是二进制方式就可以 。这就是因为字符方式用特定的标记结尾的,读取时只要碰到该标记就自动结束
5.fprintf()
①函数原型:
int fprintf(FILE * stream,const char * format,...);
②相信大家都会使用printf函数,这里只需在函数调用最前面加上文件指针,就可以像王屏幕输出输出数据那样往文件中写入数据
如:
int a = 1;
int b = 2;
FILE*fp = fopen("text.txt", "w");
fprintf(fp, "hellow world:%d\nhellow world:%d", a, b);
这样使用后得到如下结果
6.fseek()
①这个函数使用很单纯,函数原型:
int fseek(FILE * stream,long int offset,int origin);
stream-------- 输入流(地址)
offset -------- 偏移量
origin -------- 起始位置
②用法:简单来说,就是以文件stream的origin为起点,offset来设置当前文件的读写位置
origin有三个选项
SEEK_SET | 文件开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件结束* |
offset可以为 正 负 和0
7.ftell()
①返回值:当前读写位置相对于起始(文件开头)位置的偏移量
②使用方法:ftell(文件指针);
8.rewind
①函数原型:
void rewind(FILE * stream);
②:将文件读写位置移动到文件起始位置
9.feof()
①如果文件 没有结束返回0,结束了返回非零
1.对于文件来说,无论是空文件,还是存有信息的文件,当文件被打开,光标处于默认的开头时,光标后都有信息,这时候调用feof()来查看光标后是否还有内容,就没意义。
2.所以我们需要从相同中找不同,先使用getc(),从文件中读取一个字符,让光标向后移动一个字符。这时空文件的光标就已经移动到EOF的后面,这时使用feof()就会返回1了。这才是feof()的正确用法。
3.但是要注意,一定要将光标回到文件的开头,因为之前判断文件是否为空时,将光标向前移动了一位,必须要将光标恢复到开头,这样才能保证文件的正常读取。
feof函数使用参考这位博主:
https://blog.youkuaiyun.com/konghouy/article/details/80530937
10.ferror()
①当我们读取文件时,有两种情况会结束读取,一种是文件读取完毕,一种是文件读取出错。如果只用feof无法发区分这两种情况,这时候我们就需要用到 ferror()
②返回值:当文件读取出错时返回非0,不出错则返回0;
③参考这位i博主
https://blog.youkuaiyun.com/u010154760/article/details/45074695