【问题标题】:Writing at the beginning of a file, keeping file contents在文件开头写入,保留文件内容
【发布时间】:2012-11-26 20:54:14
【问题描述】:

我有一个要写入的文本文件。我想始终保留文件内容。我想在“FIFO”之后写(最后写总是在文件的第一行)。

我尝试使用 fout.open("filename"); 和 ate 模式来保留文件内容,然后使用 seekg(0) 尝试将光标收回到文件的开头。没用。

我发现这样做的独特方法我认为它非常耗时,将所有文件内容复制到一个临时文件中。写我想写,然后在目标文件末尾写临时文件的内容。

这个操作一定有简单的方法吗?

【问题讨论】:

  • 创建一个临时文件。将您的新内容写入其中。然后将旧内容复制到新的临时文件中。最后,删除旧文件,将临时文件重命名为原名。
  • @uselpa 这不正是 OP 所说的他们现在正在做的事情吗?
  • 您不能在物理上附加到末尾,但在逻辑上将其视为附加在顶部(基本上您附加到末尾但“向后读取”)
  • @Blorgbeard - 我的理解是他写了两次文件,我建议只写一次。
  • 对不起,戴夫,我恐怕做不到

标签: c++ ofstream


【解决方案1】:

Jorge,无论如何你都必须重写内存中的整个文件。您不能简单地将文件保留在原处并预先添加内存,特别是因为它是一个简单的文本文件(也许如果有某种形式的元数据,您可以......)

无论如何,你最好的机会是将旧内容刷新到一个临时位置,写下你需要的内容并附加旧内容。

【讨论】:

    【解决方案2】:

    我不确定您要的是什么。如果你想添加一个 行到文件的开头,唯一的方法是打开一个 新的,临时文件,写入行,将旧文件复制到 在新行之后,然后删除旧文件并重命名 暂时的。

    如果原行有固定长度,并且你想替换 它,那么你所要做的就是用两者打开文件 ios_base::inios_base::out

    【讨论】:

      【解决方案3】:

      首先,您应该意识到文件在历史上是流,即它们只能在一个方向上读取和写入。这来自文件存储在磁带上的时代,磁带可以朝一个方向移动(当时)。

      但是,如果您只想预先添加,那么您可以将文件向后存储。听起来很傻?也许吧,但这只需一点开销。

      除此之外,对于当前的操作系统,您将需要制作一个副本以添加前缀。虽然文件不再是流,并且可以在硬盘上随机访问,但它们仍然会朝着一个方向增长。当然,您可以创建一个文件系统,文件在其中双向增长,但我还没有听说过。

      【讨论】:

        【解决方案4】:

        使用 你可以使用 filebuf 类。

            filebuf myfile;
            myfile.open ("test.txt", ios::in | ios::out);
            if (!myfile.is_open()) cout << "cannot open" << endl;
            myfile.sputn("AAAA", 4);
            myfile.close();
        
            filebuf myfile2;
            myfile2.open ("test.txt", ios::in | ios::out);
            if (!myfile2.is_open()) cout << "cannot open 2" << endl;
            myfile2.sputn("BB", 2);
            myfile2.close();
        

        【讨论】:

          【解决方案5】:

          按你想要的顺序写入字符串,然后刷新到文件

          【讨论】:

            猜你喜欢
            • 2019-08-24
            • 1970-01-01
            • 2013-10-28
            • 1970-01-01
            • 1970-01-01
            • 2018-01-18
            • 1970-01-01
            • 1970-01-01
            • 2018-01-04
            相关资源
            最近更新 更多