fstream 文件为空(简单的小代码)

Posted

技术标签:

【中文标题】fstream 文件为空(简单的小代码)【英文标题】:fstream file empty (easy small code) 【发布时间】:2013-11-13 16:18:16 【问题描述】:

我编写了这个简单的代码来尝试这个fstream file ("....txt"),但文件保持为空! 有人可以帮忙吗? (请注意,我有一个 "selfmade" 标头 文件,其中包括我通常使用的所有文件和命名空间)

这个小程序应该从 File.txt 中找出所有内容,然后让您有机会在文件中键入新行,以中断您使用 break 的 cin 进度。但就像我说的那样,文件是空的

#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 对象将关闭并处理资源。 好的,谢谢。有什么理由吗?我知道它总是在没有的情况下工作,但我认为关闭它还是很好的,不是吗? 研究C++ RAII成语。 哦,您的问题的解决方案是您不刷新我认为的 fstream。我会添加一个答案。 【参考方案1】:

在你读完文件后,文件处于“到达文件末尾”的状态,这不是

您需要在写入(追加)之前重置流状态。这是通过流方法clear() 完成的。

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

【讨论】:

哟,谢谢!那行得通!但为什么 ios::in 和 ios::out 呢?这不是fstream的标准吗? 和另一个小问题:现在当我写例如:你好,你好吗?程序用回车“替换”空格,所以只有单个单词,没有句子,但我不想用你好,_how_are_you? 哦,我只需要使用 getline。谢谢你的帮助,安德烈也是!主题可以关闭 正如我所说,ios::in | ios::out 将是一个 explicit 文件模式,让读者知道您正在为输入和输出打开文件。有些人可能不记得fstream 默认是两者。显式文本不会损害代码生成,但确实提高了可读性。【参考方案2】:

即使它已经被回答,我想指出一个更好的结束输入的选择。如果你这样做:

#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 来结束流。

【讨论】:

以上是关于fstream 文件为空(简单的小代码)的主要内容,如果未能解决你的问题,请参考以下文章

vue中简单的小插曲

C++fstream问题,如何判断一个文件是不是为空

一个简单的代码风格优化的小案例

一个检索绝对路径下指定后缀或关键字的小代码

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包含新闻图片视频3个大模块,代码封装良好

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻图片视频3个大模块,代码封装良好