【问题标题】:ifstream does not open a file in the next iterationifstream 在下一次迭代中不打开文件
【发布时间】:2019-11-10 09:11:43
【问题描述】:

我有两个相似的方法,它们打开一个文件的方法相同,但处理它们并返回值略有不同,但是虽然第一个方法成功地做到了,但在第一个方法之后调用的第二个方法失败了。

我尝试更改此文件的路径及其扩展名,但我想我错过了有关 ifstream 的一些重要知识。

vector<User> Database::createUserDatabase()
{   
    vector<User> users;

    ifstream inputFile;
    inputFile.open(pathToFile, ios::in);

    //Some file processing

    inputFile.close();
    return users;
}

而且效果很好,而

vector<User> Database::createBookDatabase()
{   
    vector<Book> books;

    ifstream inputFile;
    inputFile.open(pathToFile, ios::in);

    //Some file processing

    inputFile.close();
    return books;
}

每当我检查文件是否已打开或未使用时都无法结束

inputFile.is_open()

这些函数定义在类文件Database.cpp、User.cpp、Book.cpp中,正确链接到main.cpp,内容如下:

#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <sstream>
#include <vector>
#include <fstream>

#include "../lib/Book.h"
#include "../lib/User.h"
#include "../lib/Database.h"

using namespace std;

int main() 
{
    Database userDatabase("../database/users.txt", "users");
    Database bookDatabase("../database/lmsdb.txt", "books");

    vector<User> users = userDatabase.createUserDatabase();
    vector<Book> books = bookDatabase.createBookDatabase();

    return 0;
}

这是我的Project directories

使用 gdb 调试器,我确认文件根本没有被打开。我假设我没有正确关闭文件,但我对 C++ 有一点了解(只学了一周左右)。

期待看到您可以建议阅读/研究什么,但我真的很想看到这个问题的直接解决方案。

【问题讨论】:

  • "vector Database::createBookDatabase()" 有一个错误。应该是“vector Database::createBookDatabase()”。这可以编译吗?
  • @ArminMontigny 这只是一个错字,我的机器上的代码是正确的。问题在于文件的路径不正确。

标签: c++ file ifstream


【解决方案1】:

我认为我没有正确关闭文件,[..]

是的,但这可能不是问题的原因。 C++ 方法是不显式关闭它们。由于RAIIifstream 将在超出范围后自行关闭(即当封闭函数终止时)。

文件无法打开的原因有很多,包括:

  • 它不存在。
  • 尝试以写入模式打开只读文件。
  • 该文件正被另一个进程使用。 (也许您已在编辑器中打开它?)
  • 权限不足(例如,由于文件受到保护)。

【讨论】:

  • 谢谢,我找到了让它工作的方法。我没有说明文件的相对路径,而是输入了一个完整路径,如下所示:D:\\Work\\Projects\\ENG 101 Final Project\\database\\users.txt,这样就可以了。你能解释一下原因吗?
  • 我不确定,除非工作目录不在您认为的位置,否则两者应该是等效的。但是,那么您的其他功能也将不起作用...This answer 显示了如何检索工作目录。您可以使用它来验证它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多