【问题标题】:Cannot update the text in text file using fstream无法使用 fstream 更新文本文件中的文本
【发布时间】:2018-01-20 16:06:40
【问题描述】:

我正在尝试减少存储在文本文件中的数字的值,如下所示:

fstream countfile;
countfile.open("adminsongcount.txt");
countfile >> songcount;
songcount--;
countfile << songcount;
countfile.close();

显然,计数应该减少 1,例如从 4 减少到 3,但事实并非如此。打开 adminsongcount.txt 我仍然得到 4 的值。 我在这里错过了什么?

【问题讨论】:

  • 你检查文件是否打开了吗?
  • 同时读取和写入文件很棘手。在大多数情况下,打开读取、读取整个文件、关闭文件、修改内存中的文件内容、打开文件写入以及重写整个文件的难度要小得多。或者从一个文件中读取写入临时文件,并在完成后用临时文件替换原始文件。
  • @ArnavBorborah 是的,我有,虽然我没有在这里包括那部分。它已经打开,没有任何问题。
  • @AtharvaRaykar 发布minimal reproducible example 否则您的代码不会被视为发生任何事情。

标签: c++ text-files file-handling


【解决方案1】:

如果 adminsongcount.txt 最初由单个字符 '4' 组成,则在运行此代码后它将有两个字符:'4' 后跟 '3'。如果您重复相同的阅读,您将再次获得'4'

要解决这个问题,代码应该在写入之前寻找文件的开头:

countfile.seekp(0);

这会将 put 指针(因此名称末尾的“p”)设置为文件的开头。

【讨论】:

  • 或者在打开文件时直接使用ios_base::open_mode::trunc 标志。当看到人们使用 seekp() tellg() 操作时,我总是会打嗝。
  • @user9212993 -- 这是个好主意,但在这里不起作用,因为它只是截断文件,因此初始读取失败并且文件最终为空。如果代码在读取后关闭文件并重新打开它以进行写入,它将起作用。
  • 是的,通常最好使用不同的std::ifstreamstd::ofstream 流而不是std::fstream 来拆分读/写操作。
  • 如果递减后位数减少,建议的解决方案将失败。
  • 根据文件的写入方式,读取可能会遇到 EOF 并导致写入失败。 3 可能不会写入文件。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多