目录
一、关于文件读写
1.文件读写
对于文件的输入和输出,是站在内存的角度而言的,并非在文件的角度来看。
如下所示:

2.流
流是一个很抽象的概念。
在使用C语言对文件操作时,所使用文件类型指针,可以理解为文件流。
在运行C语言程序时,会默认打开三个流:
标准输出流 (stdout) 终端设备如:屏幕
标准输入流 (stdin) 终端设备如:键盘
标准错误流 (stderr) 终端设备如:屏幕
二、文件的顺序读写
1.fputc——字符输出函数
![]()
参数中的c指的是待输出到文件流中的字符,stream指的是文件流。
fputc可以用来将字符输出到指定的文件中。如下:

可见,已将字符'a'存放到了打开的文件中。
2.fgetc——字符输入函数
![]()
fgetc可将文件中的字符以ASCII值得方式输出到指定的变量中,可以使用printf进行查看。如下:

可见已将第一步中存入文件的字符读取并显示。
PS:对文件的不同操作应当在定义文件指针时使用不同的打开方式。
3.fputs——文本行输出函数

string为文本行的起始地址,stream为打开的文件流。
fputs可将字符串输出到指定的文件中。如下:

4.fgets——文本行输入函数

fgets有三个参数,第一个参数为存放读取内容的变量的地址,第二个参数为读取的字符个数,第三个参数为所使用的文件流。
fgets可从文件中读取一行文本输出到内存中。
如下:

5.fprintf——格式化输出函数
fprintf的参数有所不同。将fprintf与printf放在一起对比:

fprintf函数除第一个参数为打开的文件流外,其他参数与printf格式相同。进行如下操作:

可见fprintf按照指定的格式顺序将对应类型的数据输出到了指定的文件中。
6.fscanf——格式化输入函数
同样,将fscanf与scanf进行对比:
我们使用fscanf将文件中的内容输出到内存,再使用printf打印进行查看:

7.fwrite——二进制输入

fwrite函数用于将buffer指向的数组中的数据写入到文件流stream中。使用以下代码:
#include <stdio.h>
struct S
{
char arr[10];
int n;
};
int main()
{
FILE* pf = fopen("test.dat", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
struct S s = { "hello", 19 };
fwrite(&s, sizeof(s), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
但是当程序执行结束之后打开test.dat,会发现结果与预想的不同:

我们只看到了字符串hello,但原本的数字却成为了乱码。
这是因为字符串以二进制的形式放入文件和以文本的形式放入文件的效果是相同的。
使用记事本打开看不懂二进制,接下来就使用二进制读的方式查看文件中的内容。
8.fread——二进制输入函数
使用fread将上一步存入文件中的数据输入到内存中并使用printf输出进行观察:

可以看到显示的正是使用fwrite输出到文件中的数据。
二、一些函数的对比
scanf与printf是我们常用的函数,与这两个类似的函数还有fscanf/fprintf/sscanf/sprintf。
1.scanf与printf
我们可以使用scanf读取指定类型的数据到指定类型的变量中,使用printf将变量中的数据以指定的格式显示到屏幕上。 以下代码为例。
char str[20] = {0};
int n = 0;
scanf("%s %d", str, &n);
printf("%s %d\n", str, n);
2.sscanf与sprintf
既可以使用sscanf/sprintf对输入的数据进行操作,也可以对文件流中的数据进行操作。

3.sscanf与sprintf
sscanf可将字符串转换成为格式化的数据;
sprintf可将格式化的数据转换为字符串。

总结:
a.scanf 针对标准输入流(stdin) 的格式化的输入函数
printf 针对标准输出流(stdout) 的格式化的输出函数
b.fscanf 针对所有输入流(文件流/stdin) 的格式化输入函数
fprintf 针对所有输出流(文件流/stdout)的格式化输出函数
c.sscanf 把字符串转换成格式化的数据
sprintf 把格式化的数据转换成字符串
三、文件的随机读写
1.fseek
fseek函数用于根据文件指针的位置和偏移量来定位文件指针。定义如下:

第一个参数为所使用的文件流,第二个参数为偏移量,第三个参数为起始位置。
第三个参数有三种选择:
SEEK_SET 文件的开始位置
SEET_CUR 文件指针的当前位置
SEET_END 文件的结末尾
有以下代码:
// test.txt 中已存入 abcdefg
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch = fgetc(pf); // a
printf("%c\n", ch);
ch = fgetc(pf); // b
printf("%c\n", ch);
ch = fgetc(pf); // c
printf("%c\n", ch);
ch = fgetc(pf); // d
printf("%c\n", ch);
// 相对于当前位置 向左偏移4个位置
fseek(pf,-4 ,SEEK_CUR);
ch = fgetc(pf); // a
printf("%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
可见,在文件指针向右偏移4后,再使用fseek将文件指针向左偏移4后,文件指针再次指向了起始位置。
2.ftell
ftell函数返回文件指针相对于起始位置的偏移量。
将上例修改一下,可得:

相对于文件起始位置的偏移量即为4。
3.rewind
rewind函数用于将文件指针的位置回到文件的起始位置。
如下:

可见,文件指针再次回到了偏移量为0的起始位置。
本文详细介绍了C语言中的文件读写操作,包括字符输入输出函数fputc、fgetc,文本行处理fputs、fgets,格式化输入输出fprintf、fscanf,二进制输入输出fwrite、fread。此外,还讨论了文件流的概念,并对比了scanf、printf、sscanf、sprintf等函数。最后,讲解了文件的随机读写,重点讨论了fseek、ftell和rewind函数的应用。
1万+

被折叠的 条评论
为什么被折叠?



