我正在尝试使用c ++ fstream类将long
写入文本文件。在执行之前,该文件已在磁盘上创建。我运行以下代码,可以读取初始值,但无法保存新的,覆盖。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[]) {
long f;
fstream myFile("data.txt", fstream::in|fstream::out);
cout << "f before: " << f << endl;
myFile >> f;
cout << "f after: " << f << endl;
f++;
cout << "f after increment: " << f << endl;
myFile << f;
myFile.close();
return 0;
}
之后,我读取文件中的值,但不会更改。我在这里做错了什么?
答案 0 :(得分:2)
您需要在写入之前回到文件的开头。否则,第二个值在第一个之后写入。
答案 1 :(得分:1)
您需要在myFile.seekp(ios::beg);
之前添加myFile << f;
才能正确更新计数。
如果您想继续追加到最后,请在myFile.clear();
之前添加myFile << f;
。这将导致内容变为:
1
- &GT; 12
- &GT; 1213
- &GT; 12131214
- &GT; 1213121412131215
。这是必需的,因为在读取输入时达到了eof。请注意,get和put指针是same。
正如您自己正确指出的那样,这是必需的,因为该文件的数字只是,甚至不是换行符。因此,读操作直接击中EOF并引起问题。要解决它,我们会清除eof状态并继续。
最后添加换行符是您建议的解决方案。在那种情况下
myFile.seekp(ios::beg);
myFile << f<<"\n";
将是完整的解决方案。
答案 2 :(得分:0)
我想到我在这里做错了什么:
我的文件只包含我之后想读写的内容。当我读到文件时,我达到了EOF,然后无法在最后回放或写任何东西。
那就是说,我的解决方案是在文件的末尾包含一个空格或\ n。
有谁知道API为何如此运作?看起来对我来说非常有用......
答案 3 :(得分:-1)
这与这一行有关:
myFile&gt;&gt; F;
删除它,一切正常。我不熟悉fstream,但在我看来,这段代码会尝试强制一个字符串。我也不被允许把它投入很长时间,这让我觉得这绝不是要这样执行的。我建议你阅读如何从文件中检索一个long类型的值,然后再试一次。
编辑:
在阅读了一点this网站建议您必须关闭并重新打开读取和写入之间的文件后,我惊讶于实际修复了它。我不禁想知道为什么,我认为fstream是用于阅读或写作或两者......无论如何,这是你的工作代码:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[]) {
long f;
fstream myFile("data.txt", fstream::in|fstream::out);
cout << "f before: " << f << endl;
myFile >> f;
cout << "f after: " << f << endl;
f++;
cout << "f after increment: " << f << endl;
myFile.close();
myFile.open("data.txt", fstream::in|fstream::out);
myFile << f;
myFile.close();
return 0;
}