c++ - 我无法使用 getline() 读取一行

标签 c++ visual-studio-2010 file getline

<分区>

我有一个类:

class DataBase{
private:
    fstream db_file;
public:
    DataBase(){
        db_file.open("db.txt", std::ios::in | std::ios::out);
    }

    void couteverything(){
        string line;
        if(db_file.good() && db_file.is_open()){
            getline(db_file, line);
            cout << line;
            cout << "ok";
        }

    }

    ~DataBase(){
        db_file.close();
    }
};

和一个包含一些内容的文件 db.txt。 我想将它输出到控制台,但它不起作用 - 就好像文件是空的(屏幕上什么也没有出现)。

最佳答案

在您的构造函数中,您不测试文件是否成功打开。因此,您不知道文件是否成功打开。因此,您的 couteverything 方法无法将 EOF 与“打开失败”区分开来。您可以考虑添加一张支票:

DataBase(){
    db_file.open("db.txt", std::ios::in | std::ios::out);

    if (!db_file.is_open() || !db_file.good()) {
        // put an error message here, or throw an exception.  Up to you.
    }
}

进入couteverything() 后,您可能想要遍历整个文件。为此,您需要一个循环,而不是 if 语句。像这样:

    while (getline(db_file, line)) { 
        cout << line;
        cout << "ok";
    }

即使您不想在此处循环(在这种情况下,coutnextline() 可能是该方法的更好名称),您仍想测试 getline() 的结果 直接,而不是在每次读取之前测试 good()is_open() 。您需要测试 getline() 是否成功,否则您的代码将尝试处理超出 EOF 的一行或读取错误。

    if (getline(db_file, line)) { 
        cout << line;
        cout << "ok";
    } 

如果您一次只想输出一行,我不确定调用它的代码如何知道何时停止。但是,这是一个不同的问题。 (提示:您可以通过从这种一次一行的方法返回一个 bool 来解决那个。)

关于c++ - 我无法使用 getline() 读取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635221/

相关文章:

c++ - WKT与GeoJson的区别(数据解析)

visual-studio-2010 - 按下 F5 时,如何将 Visual Studio 设置为始终构建和调试?

java - 删除文件第一行/顶行的最快 Java 方法(如堆栈)

c++ - 如何将方法指针类型转换为函数指针类型

c++ - 当同一语句中有两个递归调用时,递归如何工作?

c++ - C 中的引用

VB.NET在继续读取/写入之前检查文件是否打开?

c# - vs201 0 auto 化: Get the text value of a EnvDTE. CodeElement

file - 部署war文件而不是展开目录有什么好处?

java - 在 Java 中将字符串转换为文件