返回介绍

9.2.3 以格式化的方式读写文件

发布于 2025-04-11 22:33:05 字数 2282 浏览 0 评论 0 收藏 0

前面的两种文件的读写方式,适合于字符和字符串的处理,但若遇到数值类型的数据,就比较麻烦了,需要将数值转换成字符串,然后再进行处理。有没有更好的方法呢?

C 标准库中提供了 fprintf 函数和 fscanf 函数,可以对文件进行格式化方式的读写。它们就像 printf 函数和 scanf 函数一样,可以处理多种类型的数据。

fprintf 函数的函数原型为:

int fprintf(FILE *stream, const char *format, ...);

fprintf 函数比 printf 函数多一个参数 stream,即与文件相关联的输出流。printf 函数可以将格式化后的字符串打印输出到控制台窗口,而 fprintf 函数是将格式化后的字符串打印输出到与 stream 相关联的文件中。fprintf 函数的返回值为所打印输出的字符数,如果函数执行出错,则返回一个负整数值。

假若有如下的一个学生的结构体:

接下来,在主函数中定义该结构体类型的变量并进行初始化。然后就可以通过 fprintf 函数将结构体变量的内容写入到文件中。主函数的代码如下:

程序代码中,通过 fprintf 函数,将结构体变量 stu 的 3 个成员值写入到 D 盘 test.txt 文件中,各成员数据之间使用空格隔开。把数据隔开是为了后面能够方便地读取。

编译运行程序,在控制台窗口不会显示任何信息,但打开 D 盘上的 test.txt 文件,会看到如图 9.3 所示内容。

图 9.3 D 盘 test.txt 文件内容

可见,fprintf 函数会将格式化后的字符串输出到指定的文件中。

其实,还有一个和 fprintf 函数非常类似的函数,函数名为 sprintf,它可以将格式化后的字符串输出到一个指定的内存空间中,用户可以非常方便地通过它来将一些数值类型的数据转换为字符串。sprintf 函数的原型如下:

int sprintf(char *buffer, const char *format, ...);

和 fprintf 函数的唯一区别就是第一个参数 buffer,它并非一个文件输出流,而是一个字符类型的指针,指向一块可以存储字符串的内存空间,通常称这块内存空间为缓冲区。可以在上面的代码中再定义一个字符数组,并将 fprintf 函数换成 sprintf 函数,这样就可以将结构体变量 stu 中的数据写入到字符数组中,例如:

编译运行程序,结果如下:

100 zhangsan 90.50

下面介绍 fscanf 函数,fscanf 函数和 scanf 函数非常类似,唯一不同的是,fscanf 函数也多出了一个参数,是和文件相关联的输入流,表示从文件中读取数据。fscanf 函数的原型如下:

int fscanf(FILE *stream, const char *format, ...);

我们现在可以使用 fscanf 函数来对 D 盘上的 test.txt 文件进行数据读取,程序代码如下:

首先定义一个结构体变量 stu,然后通过 fscanf 函数读取文件数据到变量 stu 的 3 个成员,最后通过 printf 函数将结构体变量 stu 的所有成员打印输出到控制台窗口。

编译运行程序,结果如下:

num:100
name:zhangsan
score:90.50

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。