二进制的写入 fwrite :
描述:把 ptr 所指向的数组中的数据写入到给定流 stream 中;
各参数的意思和 fread 一致,只不过是把读取换成了写入;
返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
实例:
1. int main() 2. { 3. int a = 10000; 4. FILE* pfwrite = fopen("test.bin", "wb"); //以二进制写的方式打开文件 5. if (pfwrite == NULL) 6. { 7. perror("fopen"); 8. return 0; 9. } 10. fwrite(&a, sizeof(int), 1, pfwrite); //写入文件 11. fclose(pfwrite); 12. pfwrite = NULL; 13. FILE* pfread = fopen("test.bin", "rb"); //以二进制读的方式打开文件 14. if (pfread == NULL) 15. { 16. perror("fopen"); 17. return 0; 18. } 19. int b = 0; 20. fread(&b, sizeof(int), 1, pfread); //读取文件 21. printf("%d\n", b); 22. fclose(pfread); 23. pfread = NULL; 24. return 0; 25. } 26.
程序运行起来成功打印了10000,但当我们打开记事本看这个文件时却是一个看不懂的符号;
这是因为我们是以二进制的方式写的文件,所以才会显示这样,我们可以用可以查看二进制文件的软件查看,例如 vs2022 就可以查看二进制文件;
四.文件结束的判定
1.被错误使用的 feof
首先牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。所以 feof 是用来判断文件是什么原因结束的。
2.一些判断文件结束的总结
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
例子:
1. #include <stdio.h> 2. #include <stdlib.h> 3. int main() 4. { 5. int c; // 注意:int,非char,要求处理EOF 6. FILE* fp = fopen("test.txt", "r"); 7. if(!fp) { 8. perror("File opening failed"); 9. return EXIT_FAILURE; 10. } 11. //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF 12. while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环 13. { 14. putchar(c); 15. } 16. //判断是什么原因结束的 17. if (ferror(fp)) 18. puts("I/O error when reading"); 19. else if (feof(fp)) 20. puts("End of file reached successfully"); 21. fclose(fp); 22. fp=NULL; 23. return 0; 24. }
五.文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。
从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根据C编译系统决定的。
实例:
1. #include <stdio.h> 2. #include <windows.h> 3. //VS2013 WIN10环境测试 4. int main() 5. { 6. FILE*pf = fopen("test.txt", "w"); 7. fputs("abcdef", pf);//先将代码放在输出缓冲区 8. printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n"); 9. Sleep(10000); 10. printf("刷新缓冲区\n"); 11. fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘) 12. //注:fflush 在高版本的VS上不能使用了 13. printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n"); 14. Sleep(10000); 15. fclose(pf); 16. //注:fclose在关闭文件的时候,也会刷新缓冲区 17. pf = NULL; 18. return 0; 19. }
结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。
🐬🤖本篇文章到此就结束了,若有错我或是建议的话,欢迎小伙伴们指出;🕊️👻
😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩
😍😁谢谢你的阅读。😸😼