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

时间:2013-12-17 13:17:05

标签: 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。 我想把它告诉控制台,但它没有用 - 好像文件是空的(屏幕上没有任何内容)。

1 个答案:

答案 0 :(得分:1)

在构造函数中,您不测试文件是否成功打开。因此,您不知道文件是否成功打开。因此,您的couteverything方法无法区分EOF和&#34;无法打开。&#34;您可以考虑添加支票:

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()的结果,而不是测试{每次阅读之前{1}}和good() 。您需要测试is_open()是否成功,否则您的代码将尝试处理超出EOF的一行或读取错误。

getline()

如果您只想一次输出一行,我不确定调用它的代码如何知道何时停止。但是,这是一个不同的问题。 (提示:你可以通过从这个一次一行的方法返回 if (getline(db_file, line)) { cout << line; cout << "ok"; } 来解决那个。)