【问题标题】:C++ Write on a Specific Line in a FileC++ 在文件的特定行上写入
【发布时间】:2015-05-03 04:34:39
【问题描述】:

现在我可以读取文件的特定行,但问题是,如何在文件的同一特定行上写入?例如,假设第 1 行说“Test”,第 2 行说“Congratz”,第 3 行“Yay”,我怎样才能让它像 2 一样用“Yess”或表格中的东西替换。顺便说一句,在我的 int main() 代码中,我调用 readLine(0);并检查行是否为零,我调用 if (lineNumber == 0);提前致谢!

void readLine(int lineNum) {
    ifstream fin("StartupMap.dat");
    string s;
    long length;

    fin.seekg (0, ios::beg); // go to the first line

    for (int i = 0; i <= lineNumber; i++) // loop 'till the desired line
        getline(fin, s);
    if (lineNumber == 0)
        true1 = true;

    length = fin.tellg(); // tell the first position at the line, maybe +1 or -1. try if it's not working
    fin.seekg(length);

    lineNumber = lineNum;
}

【问题讨论】:

  • 除非你提前准备好行来保存额外的数据(即你在输出中放置填充物,否则你可能会在那个位置写更大的东西,但不会大于填充物) ,如果不重写文件的其余部分,您将无法做到这一点,行号并不重要。就文件系统而言,它们都只是字节。

标签: c++ visual-studio-2010 text document


【解决方案1】:

文件只是一个字符流。这意味着如果您想延长一行,那么您必须将文件中出现在该行之后 的所有内容向前移动以腾出空间。相反,如果您想缩短一行,则必须将该行之后的文件中的所有内容向后移动。

这是非常低效的。

避免就位的唯一实用方法是确保所有行的长度都是固定的。

否则,您要么需要读入整个文件并在编辑后再次将其写出,要么将文件复制到新文件中,随时更改。

例如:

文件中的 3 行可能如下所示:

Test\nCongratz\nYay
0     5         14   <- start position of line

Line 1 is "Test"
Line 2 is "Congratz"
Line 3 is "Yay"

如果您想将第 2 行改为“Yess”,则需要将第 3 行向后移动:

Test\nYess\nYay <= now line 3 starts sooner
0     5     10  <- start position of line

这意味着根据编辑位置移动几乎整个文件。

【讨论】:

  • 无论如何我可以在第 2 行之间放置一个特殊字符,让它在特殊字符之间读取并写入它吗?
  • @Ryan12345 我不明白你的意思。在文件中,一行基本上是以特殊字符 '\n' 结尾的字符串。
  • 他们有什么可能的方式我可以编辑某一行吗?有可能吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多