【问题标题】:Jump to end of specific line跳转到特定行的末尾
【发布时间】:2013-05-07 14:48:24
【问题描述】:

我正在尝试在打开的文件中更改光标位置。

fp = fopen("dirty", "a+");
fprintf(fp, "Text at end of file");

// seek to end of third line (eg.)

fprintf(fp, "Text at end of third line");

我已尝试关闭并重新打开文件和fseek,但没有成功。

任何帮助将不胜感激。

【问题讨论】:

  • 只要你知道第三行的位置,fseek 就可以了。你能告诉我们你有什么不能使用fseek()吗?
  • 感谢您的回复。我发现我应该用 r+ 模式打开文件。现在fseek(fp, 2, SEEK_SET); 可以工作了。我怎样才能找到行尾的权利?超出 EOL 将开始覆盖下一行。
  • 你需要知道行尾在什么位置。这是无可替代的。
  • 好吧,我想我得弄清楚这一点。我怎样才能批准你的回答?
  • 如果一行的长度未定义,则不可能简单地 SEEK。

标签: c file-io stdio


【解决方案1】:

要在文件中查找位置,请使用fseek()。除了存在“行尾标记”换行符 ('\n') 之外,在 C/C++ 文件处理中不知道行的开始和/或结束位置。

要知道一行从哪里开始或结束,您必须自己跟踪(例如,通过使用fgetc() 逐个字符读取文件,使用fscanf() 逐个元素或逐行读取fgets() 以及当您找到某些重要部分,使用ftell()保存当前位置。

请注意,虽然fgets() 似乎知道行,但它实际上只是从您在文件中的位置读取,并且当字符是换行符时,它会停止。但是没有关于“这一行有 40 个字符长”的知识。

【讨论】:

    【解决方案2】:

    你必须fseek 到文件的开头,然后用getc 逐个字符地读取,直到你找到第三个换行符,然后是ungetc(只能得到一个字符)。但是请注意,您不能在第三行之后插入文本而不覆盖第四行。

    (在文件中间插入通常是通过复制初始部分,写入新数据,然后复制最终部分来执行的。)

    【讨论】:

    • 感谢您的最后提示。我现在看到了这个问题,因为我有 fseek 工作。你有什么代码可以解决这个问题吗?
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多