我上课了:
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。 我想把它告诉控制台,但它没有用 - 好像文件是空的(屏幕上没有任何内容)。
答案 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";
}
来解决那个。)