4.1 对比一组函数
1. #include <stdio.h> 2. #include <string.h> 3. #include <errno.h> 4. 5. struct Stu 6. { 7. char name[20]; 8. int age; 9. double d; 10. }; 11. 12. int main() 13. { 14. struct Stu s = { "张三", 20, 95.5 }; 15. struct Stu tmp = { 0 }; 16. char buf[100] = { 0 }; 17. sprintf(buf, "%s %d %lf\n", s.name, s.age, s.d);//把后面的内容,按照格式放到字符串buf中 18. 19. printf("%s\n", buf); 20. sscanf(buf, "%s %d %lf", tmp.name, &(tmp.age), &(tmp.d));//把字符串buf里的内容放到后面 21. printf("%s %d %lf", tmp.name, tmp.age, tmp.d); 22. //关闭 23. return 0; 24. }
scanf、fscanf、sscanf
printf、fprintf、sprintf
scanf 从标准输入流(stdin)上进行格式化输入的函数
printf向标准输出流(stdout)上进行格式化的输出函数
fscanf 可以从标准输入流(stdin)/指定的文件上读取格式化的数据
fprintf把数据按照格式化的方式输出到标准输出流(stdout)/指定的文件
sscanf 可以从一个字符串提取(转化)出格式化数据
sprintf 把一个格式化的数据转化成字符串
五 文件的随机读写
5.1 fseek
根据文件指针的位置和偏移量来定位文件指针。
int fseek ( FILE * stream , long int offset , int origin );
EILE* stream表示pf
long int offset表示偏移量
int origin有三种选择:SEEK_SET(这个表示起始位置)、SEEK_CUR(这个表示除了起始和末尾的位置)、SEEK_END(这个表示末位的位置)
读:
1. #include <stdio.h> 2. #include <string.h> 3. #include <errno.h> 4. 5. 6. int main() 7. { 8. FILE* pf = fopen("text.txt", "r"); 9. if (pf == NULL) 10. { 11. printf("%s\n", strerror(errno)); 12. return 0; 13. } 14. 15. //读文件 16. int ch = fgetc(pf); 17. printf("%c\n", ch);//a 18. ch = fgetc(pf); 19. printf("%c\n", ch);//b 如果不加干预的话,下次获取出来的就是c, 20. //定位指针文件 21. //用fseek可以直接让pf定位到f 22. //fseek(pf, 3, SEEK_CUR);//方法一:直接让pf定位到f 23. //fseek(pf, 5, SEEK_SET);//方法二:也可以直接让pf定位到f,这里的SEEK_SET表示起始位置 24. fseek(pf, -1, SEEK_END);//方法三:也可以直接让pf定位到f,这里的SEEK_END表示末尾位置 25. ch = fgetc(pf); 26. printf("%c\n", ch);//f 27. 28. //关闭文件 29. fclose(pf); 30. pf = NULL; 31. return 0; 32. }
打印结果;abf
写:
1. #include <stdio.h> 2. #include <string.h> 3. #include <errno.h> 4. int main() 5. { 6. FILE* pf = fopen("text.txt", "w"); 7. if (pf == NULL) 8. { 9. printf("%s\n", strerror(errno)); 10. return 0; 11. } 12. //写文件 13. int ch = 0; 14. for (ch = 'a'; ch < 'z'; ch++) 15. { 16. fputc(ch, pf); 17. } 18. fseek(pf, -1, SEEK_END);//直接让pf定位到z,这里的SEEK_END表示末尾位置 19. fputc('#', pf); 20. 21. 22. //关闭文件 23. fclose(pf); 24. pf = NULL; 25. return 0; 26. }
打印:
5.2 ftell
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream ); 返回的是偏移量的值,即偏移量是多少(偏移量从0开始)
5.3 rewind
让文件指针的位置回到文件的起始位置。
void rewind ( FILE * stream ); (文件指针回到起始位置)
六 文本文件和二进制文件
数据文件被称为 文本文件 或者二进制文件。 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是 二进制文件(我们看不懂的文件) 。 如果要求在外存上以 ASCII 码的形式存储,则需要在存储前转换。以 ASCII 字符的形式存储的文件就是 文本文件。
字符一律以 ASCII 形式存储,数值型数据既可以用 ASCII 形式存储,也可以使用二进制形式存储。
七 文件读取结束的判断
7.1 被错误使用的feof
在文件读取过程中,不能用 feof 函数的返回值直接用来判断文件的是否结束。
而是 应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束 。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:fread 判断返回值是否小于实际要读的个数。
(fgetc(字符)fgets(文本)fread(二进制))
八 文件缓冲区
ANSIC 标准采用 “ 缓冲文件系统 ” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块 “ 文件缓冲区 ” 。从内存向磁盘输出数据会先送到 内存中 的缓冲区,装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根 据 C 编译系统决定的。
因为有缓冲区的存在, C 语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。 如果不做,可能导致读写文件的问题。
关闭文件,会刷新缓冲区