【问题标题】:c++ how modify file using fstreamc ++如何使用fstream修改文件
【发布时间】:2020-08-07 12:02:25
【问题描述】:

我想编辑文件的前 100 个字符, 我这样做了,但是新字符会覆盖以前的字符(如照片)

我的代码:

fstream fileStreamIn("text.txt", ios::in | ios::out | ios::binary);

int theSize = 100;
string theMainBuffer(theSize, '\0');
fileStreamIn.read(&theMainBuffer.front(), theSize);
theMainBuffer.resize(fileStreamIn.gcount());
//cout << theMainBuffer << endl;
fileStreamIn.close();


fileStreamIn.open("text.txt", ios::in | ios::out | ios::binary);
fileStreamIn  << "blahblah ";
fileStreamIn.close();

我希望将“blahblah”添加到文件的内容中,并且不要删除“helloworld”之前的内容

输出:

blahblahrld !
è !©ª}2•¼Ü²ù­XkLÉ·ð„!ð–ç„ñWïðʃ¡ åñ·§Dß}ˆ¹mÐÕŠw:—*ËtMÒJf-Öù“hñ<³:rÛä‡   ”‘Ôyv-4mXþeß§zè’¬ŒŽ<¤‘“‰l'g‚Šâ¡;¬Èa|ÔÁ3îú€;‰±Ï.ÖLáÑȽ[ïÿÿúU%ã2§Ls§n~çˆÏÔäÔ™ 4øÒ‘Ö°,y•»Ô'`` ¬ÜgÜò`÷Tº^E1ØàùÛ÷i§d¨Ù`I5»7á8Zéz0¥Ž’3Y7Êœ¦}eíÝΦIm?óbÙOâ-ŸäëŠgýhýR
Â3‘†y±è±/VФ?Ïù4?’ÑûIÆLQ~DãŠ?Ôêð#N ]³böPK     ZQamë  š  PK      5   -    

我想要这个输出:

blahblah hello world !
è !©ª}2•¼Ü²ù­XkLÉ·ð„!ð–ç„ñWïðʃ¡ åñ·§Dß}ˆ¹mÐÕŠw:—*ËtMÒJf-Öù“hñ<³:rÛä‡   ”‘Ôyv-4mXþeß§zè’¬ŒŽ<¤‘“‰l'g‚Šâ¡;¬Èa|ÔÁ3îú€;‰±Ï.ÖLáÑȽ[ïÿÿúU%ã2§Ls§n~çˆÏÔäÔ™ 4øÒ‘Ö°,y•»Ô'`` ¬ÜgÜò`÷Tº^E1ØàùÛ÷i§d¨Ù`I5»7á8Zéz0¥Ž’3Y7Êœ¦}eíÝΦIm?óbÙOâ-ŸäëŠgýhýR
Â3‘†y±è±/VФ?Ïù4?’ÑûIÆLQ~DãŠ?Ôêð#N ]³böPK     ZQamë  š  PK      5   -    

这是什么问题,我该如何解决? 谢谢

【问题讨论】:

  • 如果你想编辑,你想覆盖它们,对吧?或者你想预先添加字符?在后一种情况下,这不会自动实现,您必须手动移动文件的内容。
  • 我想保留文件的内容,我想编辑它

标签: c++ binary fstream ifstream ofstream


【解决方案1】:

如果您不想保留前 100 个字节,只需创建 100 个长度的字符串,更改一些值并将其写入流就足够了。不需要读取文件。

std::fstream fs("text.txt", ios_base::out | ios_base::binary);

string buffer(100, ' ');
string update="Hello";
buffer.replace(0, update.size(), update);

fs.seekp(20);   // move to write position
fs.write(buffer.data(), buffer.size());

fs.close();

【讨论】:

  • 谢谢,我的问题还没解决,新字符还是放在已有字符上面
  • @NewCoder,修改缓冲区大小和写入可以帮助你。用空字符填充缓冲区,(100个字符)更改缓冲区的内容(20个字符)并写入流而不调整缓冲区的大小。(100个字符)我只展示了如何正确修改双向文件流。
  • 谢谢,有时间,给个更完整的例子
  • 我对答案做了一些修改。
  • 谢谢亲爱的朋友,我更新了我的问题,我想你没看懂我的问题
【解决方案2】:

使用 ios::trunc 作为文件打开模式。 欲了解更多信息,请查看this

【讨论】:

  • 我希望保留文件的内容并进行编辑
  • 如果您想追加新内容并转移已经存在的内容,那么您必须将整个文件读入字符串,然后将其写回。或者如果文件太大,则创建一个新文件,添加您要添加​​的新内容,然后从旧文件中读取并逐块写入新内容,然后在新文件上使用重命名(在 cstdio 或 stdio 中)。
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2012-04-05
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多