9.2.1 以字符的方式读写文件
对于文本文件来说,可以使用 C 语言标准库中提供的 fgetc 函数和 fputc 函数,以字符的方式对文件进行读写操作。
其中,fputc 函数是以字符的方式向文件中输出(写入)数据。其函数原型如下:
int fputc(int ch, FILE *stream);
函数有两个参数,第一个参数 ch 为欲写入文件的字符,第二个参数 stream 为与写入文件相关联的文件流。函数的功能就是将参数 ch 所表示的字符写入文件流 stream 所关联的文件中。函数返回值为所写入的字符,如果出错,返回 EOF。
【 例 9-1 】编写程序,将“Red apple”以字符的方式写入 D 盘的 test.txt 文件中。
程序代码如下:
程序代码中,通过临时指针 ptmp 的移动来遍历字符数组中的字符串各字符,如果是非空字符,就通过 fputc 函数,将其写入到文件流 pfile 所关联的文件中,直至 ptmp 指向字符串末尾的空字符时止。
编译运行程序,正常情况下,会打印写入完毕的结果。打开计算机 D 盘上的 test.txt 文件,就应该能看到写入到文件中的字符串“Red apple”。
需要注意的是,在对文件处理完毕后,应养成及时关闭文件的好习惯。因为在程序对文件进行读写时会使用缓冲区,向文件写入数据,其实是先将数据写入到缓冲区中,只有在缓冲区满或是强制刷新的情况下,数据才会从缓冲区写到文件中。如果发生程序异常、崩溃或是突然断电等情况,可能会存在缓冲区中数据未写入文件的情况,造成数据的丢失。因此,最好的办法,就是及时地将缓冲区中的数据写入文件。
C 语言中,刷新缓冲区的函数为 fflush,该函数原型如下:
int fflush(FILE *stream);
该函数对参数 stream 所对应的输出缓冲区进行刷新,将输出缓冲区中的数据强制写入文件。函数执行成功返回 0,如果出错,则返回 EOF。
在完成对文件的数据写入后,我们可以调用 fflush 函数来刷新输出缓冲区,将数据真正地写入到文件中。例如:
在关闭文件之前调用 fflush 函数,刷新 pfile 所对应的输出缓冲区,将数据强制写入 D 盘的 test.txt 文件中。
其实,在 fclose 函数中也会隐含地调用 fflush 函数来刷新输出缓冲区,所以,当调用 fclose 函数对文件进行关闭时,也间接地达到了刷新输出缓冲区的目的。因此,在这儿是可以省略掉 fflush 函数的语句。但千万别既不使用 fflush 显式地刷新缓冲区,也不使用 fclose 来隐含地刷新缓冲区。
和 fputc 函数相对应的是 fgetc 函数,它是以字符的方式从文件中读取数据。fgetc 的函数原型如下:
int fgetc(FILE *stream);
fgetc 函数的参数 stream 应该是一个文件输入流,函数的功能就是从 stream 相关联的文件中读取一个字符作为函数的返回值。若是读到了文件末尾,或是发生了错误,则返回 EOF。EOF 和用作字符串末尾结束标记的空字符有些类似,空字符用于标记字符串的末尾,而 EOF 用于标记文件的末尾。
【 例 9-2 】编写程序,以字符的方式读取 D 盘 test.txt 文件中的内容,将其存储到字符数组中,并打印输出。
程序代码如下:
在 while 循环的条件检测处,首先使用 fgetc 函数从文件中读取字符,并通过对指针 p 的解引用将字符存储到字符数组中,并判断读取到的字符是否为 EOF 字符。若非 EOF 字符,则移动指针,进行下个字符的读取与存储,若为 EOF 字符,则终止 while 循环。需要注意的是,由于赋值运算符的优先级低于关系运算符,因此,需要用小括号来提升赋值表达式的优先级。
在 while 循环之后,通过指针 p 的解引用,将最后存储在字符数组中的 EOF 字符修改为空字符,以作为字符串的结束标记。
编译运行程序,结果如下:
The read content is: Red apple
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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