9.2.3 以格式化的方式读写文件
前面的两种文件的读写方式,适合于字符和字符串的处理,但若遇到数值类型的数据,就比较麻烦了,需要将数值转换成字符串,然后再进行处理。有没有更好的方法呢?
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论