【问题标题】:How do you write to a specific line of a txt file in C?如何在 C 中写入 txt 文件的特定行?
【发布时间】:2014-04-01 23:02:16
【问题描述】:

我想覆盖 txt 文件中的某一行,同时保持所有其他行不变。有没有一种简单又好用的方法?

【问题讨论】:

标签: c file output


【解决方案1】:

基本上使用 Fseek() 来搜索你想要改变的位序列,
然后使用 Fwrite() 覆盖旧文本

OBS:需要以rw模式打开文件才能覆盖

fopen ("myfile.txt", "wr");

使用这些参考:

http://www.cplusplus.com/reference/cstdio/fwrite/
http://www.cplusplus.com/reference/cstdio/fseek/

(它说的是 C++,但适用于 C)

【讨论】:

  • 如前所述,这仅适用于写入的新旧字节数相同的情况。
  • 另外,在文本文件上使用fseek 时要小心,因为查找偏移量可能不等于从开始读取到该点的字节数。
【解决方案2】:

除非您要覆盖的行的长度具有相同的字节数,否则您不能在现有文件中“插入”或“删除”字节。您必须编写一个新文件:

  1. 读入所有旧行直到您需要覆盖的行,并将它们写入另一个输出流(新文件指针或stdout
  2. 将新行写到输出流中
  3. 读入所有旧行您覆盖的行之后,并将这些行写入新的输出流

如果您想覆盖现有字节并且您确定新旧行的长度完全相等,那么您可以:

  1. fopen()rw模式下的文件
  2. fseek() 到旧行的字节位置(或读入字符,直到您遇到预设数量的换行符等 - 基本上,您希望将文件指针移动到旧行的开头)
  3. fwrite() 旧行字节上的新字节
  4. fclose()文件指针

如果您确实需要覆盖同一文件中的字节,并且您的新行的字节数比旧行,您也许可以做一些技巧,用空格覆盖旧行的末尾换行符之前的字符,但更简洁的解决方案是简单地编写一个包含更新内容的新文件。

【讨论】:

  • 该死,这就是我认为我必须首先做的事情。我想也许有人在那里耍了花招。谢谢
  • 但是如果你在覆盖后读取新行之后的旧行,你可能没有所有的旧行。最好先读完整个文件,在新行之前写旧行,写新行,然后再写剩下的旧行,不是吗?
  • P.S.你能指出我做类似事情的sn-p代码吗?我不太擅长 C I/O
  • 只需使用搜索引擎搜索fseekfwritecode sample 等字词。网上已经有很多例子。
猜你喜欢
  • 2014-11-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多