2

我正在尝试long使用 c++ fstream 类将 a 写入文本文件。该文件在执行之前已经在磁盘上创建。我运行以下代码,可以读取初始值但无法保存新值,覆盖。我究竟做错了什么?

#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;
}

之后,我读取了文件中的值并且它没有改变。我在这里做错了什么?

4

4 回答 4

2

在写入之前,您需要倒退到文件的开头。否则第二个值写第一个值之后。

于 2012-12-14T12:30:15.250 回答
1

您需要在myFile.seekp(ios::beg);之前添加myFile << f;才能正确更新计数。

如果要继续追加到末尾,请添加myFile.clear();before myFile << f;。这将导致内容变为 : 1-> 12-> 1213-> 12131214-> 1213121412131215。这是必需的,因为在读取输入时会达到 eof。请注意,get 和 put 指针是相同的。

正如您正确指出的那样,这是必需的,因为文件只有数字,甚至没有换行符。因此,读取操作直接命中 EOF 并导致问题。为了解决这个问题,我们清除 eof 状态并继续。

如您所建议的,在末尾添加换行符是一种解决方案。在这种情况下

myFile.seekp(ios::beg);
myFile << f<<"\n";

将是完整的解决方案。

于 2012-12-14T12:32:58.060 回答
0

我想我在这里做错了什么:

我的文件只包含我以后想读和写的长度。当我阅读文件时,我到达了 EOF,然后无法倒带或最后写任何东西。

也就是说,我的解决方案是在文件末尾包含一个空格或 \n。

有谁知道为什么 API 会这样工作?对我来说似乎不是很有用......

于 2012-12-14T16:23:44.117 回答
-1

它与这一行有关:

我的文件 >> f;

删除它,一切正常。我对 fstream 不熟悉,但在我看来,这段代码会试图强制一个长字符串。我也不允许将其投射到很长,这让我认为这永远不会像这样执行。我建议您阅读如何从文件中检索长类型的值,然后再试一次。

编辑:
读了一点这个网站建议你必须在读写之间关闭并重新打开文件,我很惊讶它实际上修复了它。我不禁想知道为什么,我认为 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;
}
于 2012-12-14T12:50:09.367 回答