顺便聊一下基础知识 | 每日一面(86)

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:我想用 “r+” 打开一个文件, 读出一个字符串, 修改之后再写入,

从而就地更新一个文件。可是这样不行。

小林:确保在写操作之前先调用 fseek, 回到你准备覆盖的字串的开始, 况且在读写“+” 模式下的读和写操作之间总是需要 fseek 或 fflush。同时, 记住改写同样数量的字符, 而且在文本模式下改写可能会在改写处把文件长度截断, 因而你可能需要保存行长度。

读者:怎样在程序里把 stdin 或 stdout 重定向到文件?

小林:使用 freopen()。

读者:一旦使用 freopen() 之后, 怎样才能恢复原来的 stdout (或

stdin)?

小林:没有什么好办法。如果你需要恢复回去, 那么最好一开始就不要使用 fre-open()。可以使用你自己的可以随意赋值的输出 (输入) 流变量, 而不要去动原来的输出 (或输入) 流。有一种不可移植的办法, 可以在调用 freopen() 之前保存流的信息, 以便其后恢复原来的流。一种办法是使用系统相关的调用如 dup(), dup2() 等。另一种办法是复制或查看 FILE 结构的内容, 但是这种方法完全没有可移植性而且很不可靠。

正文完