文件流(fstream)为空(easy small code)

3
我写了一个简单的代码,试图使用fstream file("....txt")来操作文件,但是文件始终为空!有人能帮忙吗?(请注意,我有一个"自制"的头文件,其中包含我通常使用的所有文件和命名空间。)
这个小程序应该cout从File.txt中获取的所有内容,然后让您有机会向文件中输入新行,要终止cin进度,请使用break。但像我说的那样,文件始终为空。
#include <myHead.h>

int main()
{
    string line;
    int i;
    fstream myFile ("File.txt");

    if (myFile.is_open())
    {
        while (getline(myFile,line))
        {
            cout << line << "\n";
        }

        line = "0";

        for(line;line!="break";cin >> line)
    {
        if(line != "break")
            myFile << line;
    }

        myFile.close();

    }
    else
        cout << "error, File.txt cannot be opened!";

    getch();
    return 0;
}

只是我个人的一些小抱怨。myFile.close(); 是不必要的。RAII 惯用法意味着 fstream 对象会自动关闭和处理资源。 - andre
好的,谢谢。这样做有什么原因吗?我知道不关闭也可以正常工作,但是关闭还是比较好的,不是吗? - Hans Peter
研究C++的RAII习惯用法。 - andre
哦,你的问题的解决方案是你没有刷新fstream流。我会添加一个答案。 - andre
2个回答

4

当您阅读完文件后,文件处于“到达文件结尾”的状态,这并不好。

在写入(追加)之前,您需要重置流状态。这可以使用流方法 clear() 完成。

此外,您可能希望明确将文件作为输入和输出打开:ios::in | ios::out


谢谢!那个有效了!但是为什么要用ios::in和ios::out?这不是fstream的标准吗? - Hans Peter
另外还有一个小问题:现在当我写例如:“你好,你怎么样?”程序会“替换”空格为回车,所以只有单个单词而没有句子,但我不想使用hello,_how_are_you? - Hans Peter
哦,我只需要使用getline。感谢你的帮助,还有安德烈的!话题可以关闭了。 - Hans Peter
正如我所说,ios::in | ios::out 将是一种显式文件模式,让读者知道您正在打开文件进行输入和输出。有些人可能不记得 fstream 的默认设置是两者都包括。显式文本不会影响代码生成,但确实提高了可读性。 - Thomas Matthews

0

虽然已经有答案了,但我想指出一种更好的结束输入的选项。如果你这样做:

#include <string>
#include <iostream>
#include <fstream>

int main(void)
{
    std::fstream file("file");
    std::string buf;

    if (file.is_open())
    {
        std::cout << "READ:" << "\n\n";
        while (getline(file, buf))
        {
            std::cout << buf << "\n";
        }

        file.clear();

        std::cout << '\n' << "WRITE:" << "\n\n";
        while (getline(std::cin, buf))
        {
            file << '\n' << buf;
            file.seekp(0, file.end);
            file.seekg(0, file.end);
        }

        file.close();
    }
    else
    {
        std::cout << "error, file could not be opened.";
    }

    return 0;
}

您可以在 Windows 上按 Ctrl+Z + Enter,或者在 UNIX 系统上按 Ctrl+D 结束流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接