open / seekp / write是截断文件

时间:2014-04-22 21:16:32

标签: c++ fstream

说明:我有一个文本文件,里面有几行,我想写两行之间。

我尝试了什么:我有一个循环来确定我想要写的位置。当我尝试打开文件时,使用seekp来定位输入,然后写入文件被截断。

示例

file.txt的:

Hello
Write under this line
Write above this line

代码:

ofstream myfileo;
myfileo.open("file.txt");

cout<<myfileo.tellp()<<endl;//starts at 0

myfileo.seekp(26);//move to 26 ...End of second line
cout<<myfileo.tellp()<<endl;//says 26

string institution ="hello";
myfileo<<"\n"<<institution<<"\n";
myfileo.close();

问题:我不确定文件被截断的原因。我尝试使用追加,但无论它写到底部是什么原因,但是我不确定我做错了什么。

谢谢, JT

1 个答案:

答案 0 :(得分:0)

尝试做我在评论中发布的内容是可能的,但令人沮丧。 以下代码适用于此特定示例,但并不适用于所有情况:

#include <algorithm>
#include <fstream>
#include <iterator>
#include <string>
#include <vector>

int main (void)
{
    std::fstream file ;

    file.open ("test.txt") ;
    file.seekg (28, file.beg) ; // 28 was the correct offset on my system.

    auto begin = std::istream_iterator <std::string> (file) ;
    auto end = std::istream_iterator <std::string> () ;
    std::vector <std::string> buffer (begin, end) ;

    file.clear () ; // fail-bit is sometimes set for some reaon.
    file.seekg (28, file.beg) ;
    file << "\n" "hello" "\n" ;

    std::copy (std::begin (buffer), std::end (buffer), 
        std::ostream_iterator <std::string> (file, " ")) ;

    return 0 ;
}

如果您不想将所有内容加载到内存中,更好的解决方案是使用临时文件。我们称之为 temp.txt 。然后你会:

  1. file.txt 复制到 temp.txt 所有内容,然后再插入文本。
  2. 将要插入的文本插入 temp.txt
  3. 复制到 temp.txt file.txt 的其余部分。
  4. 删除 file.txt
  5. temp.txt 重命名为 file.txt
  6. 步骤4和5是特定于操作系统的(除非你有一些可以执行此操作的可移植库)。