gpt4 book ai didi

c++ - open/seekp/write 正在截断文件

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:27 27 4
gpt4 key购买 nike

描述:我有一个包含几行的文本文件,我想在两行之间写入。

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

示例

文件.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();

问题:我不确定文件被截断的原因。我尝试使用 append,但无论它向底部写入什么,从那以后,我都不确定我做错了什么。

谢谢,JT

最佳答案

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

#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. file.txt 的其余部分复制到 temp.txt 中。
  4. 删除file.txt
  5. temp.txt 重命名为 file.txt

第 4 步和第 5 步是特定于操作系统的(除非您有一些可以执行此操作的可移植库)。

关于c++ - open/seekp/write 正在截断文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23230363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com