C语言文件操作(下)

简介: C语言文件操作(下)

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 语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。 如果不做,可能导致读写文件的问题。

关闭文件,会刷新缓冲区

相关文章
|
1月前
|
存储 编译器 C语言
关于文件操作---C语言
关于文件操作---C语言
|
1月前
|
存储 程序员 C语言
C语言-文件操作
C语言-文件操作
53 2
|
2月前
|
安全 算法 程序员
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
49 0
|
2月前
|
存储 编译器 数据库
【文件操作】C语言
【文件操作】C语言
|
2月前
|
C语言
C语言文件操作
C语言文件操作
18 0
C语言文件操作
|
2月前
|
C语言
C语言文件操作
C语言文件操作
|
1月前
|
存储 程序员 编译器
【C语言】深度探讨文件操作(一)
【C语言】深度探讨文件操作(一)
|
4天前
|
存储 程序员 C语言
C语言:文件操作
C语言:文件操作
10 1
|
5天前
|
存储 C语言 C++
【C语言】文件与文件操作
前言:我们通过学习的技术可以完成计算与字符串处理,但程序结束之后就都消失了,这样岂不可惜。我们通过文件与数据持久化保存相关的基础知识。
8 0
|
7天前
|
存储 编译器 C语言
C语言中的文件操作指南
C语言中的文件操作指南
12 0