繁体   English   中英

在 fstream 上使用 << 编写

[英]Writing using << on an fstream

我正在尝试使用 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;
}

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

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

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

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

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

在最后添加换行符是您建议的解决方案。 在这种情况下

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

将是完整的解决方案。

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

我的文件只包含我之后想要读写的长度。 当我阅读文件时,我到达了 EOF,然后在最后无法倒带或写入任何内容。

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

有谁知道为什么 API 以这种方式工作? 对我来说似乎不是很有用...

它与这一行有关:

我的文件>> f;

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

编辑:
在阅读了一些网站建议您必须在读取和写入之间关闭并重新打开文件后,我很惊讶实际上修复了它。 我不禁想知道为什么,我认为 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM