【问题标题】:ifstream won't find file even though it's in the same directoryifstream 不会找到文件,即使它在同一个目录中
【发布时间】:2021-07-07 16:22:38
【问题描述】:

我有一个从文件中读取布尔向量的方法:

std::vector<bool> OPCConnector::getAlarmVector() {
    std::vector<bool> data;
    std::ifstream DataFile(filepath);

    if (DataFile) {
        bool value;

        while (DataFile >> value) {
            data.push_back(value);
            std::cout << value;
        }
    }
    
    return data;
}

filepath 变量是通过构造函数分配的对象属性:

OPCConnector::OPCConnector(std::string fpth) {
    filepath = fpth;
}

而在main()函数中,构造函数被调用:

std::vector<bool> activations;
std::string filepath = "alarmes.txt";
OPCConnector opcc = OPCConnector(filepath);
activations = opcc.getAlarmVector();

现在,我通过GetModuleFileNameA() 检查了可执行文件的文件夹是什么,并确保该文件位于同一目录中并且具有相同的名称(另外,我确保扩展名不是文件名的一部分,如"alarmes.txt.txt")。

我调试了第一个方法getAlarmVector(),它永远不会超过if (DataFile)条件,就好像它找不到文件一样。

我使用 Visual Studio 2019 运行代码,但没有任何反应。向量保持为空。错误是没有这样的文件或目录。

默认工作目录是$(ProjectDir),它正是我的文件所在的位置。

编辑:我也尝试过同时使用相对路径和绝对路径,但都不行。

编辑 2:我还检查了使用 GetCurrentDirectory() 的目录并将 .txt 文件也复制到那里,但它不起作用。

解决方案: 奇怪的是,我删除了该文件并再次使用相同的名称创建了它,它仍然有效。感谢您的回答。

【问题讨论】:

  • 使用VS,您需要将文件放在源文件所在的相同位置。例如,如果您的项目名为 CoolCode。你应该有一个像SOMEDRIVE:path_to_projectfiles/CoolCode/CoolCode/ 这样的路径,在那里,会有你的源文件和一个调试和发布文件夹。把你的文本文件放在那里,看看它是否打开。
  • else { std::perror("OpenDataFile"); }stderr 你会知道问题出在哪里。
  • 感谢您的快速回复。以防万一,我也将文件复制到那里,以及其他几个文件夹中。似乎没有一个工作。发布编辑,
  • Ok No such file or directory 表示路径无效或当前目录与您假设的不同。我猜 Jeseph Lastson 是对的。

标签: c++ file ifstream


【解决方案1】:

我的猜测:您当前的工作目录并不是您想象的那样,尤其是当您从 IDE 运行时。我知道几个 IDE,其中当前工作目录是某个构建目录(它因 IDE 而异),除非您专门更改它。

我很确定 Visual Studio 就是这样一种 IDE。


这是我编写的一个小示例程序;
$ cat Foo.cpp
#include <iostream>
#include <fstream>

int main(int, char **) {
    std::ifstream file { "Foo.cpp" };

    if (file) {
        std::cout << "File opened.\n";
    }
    else {
        std::cout << "File not opened.\n";
    }
}

编译并运行它:

$ g++ --std=c++17 Foo.cpp -o Foo && Foo
File opened.

【讨论】:

  • VS默认使用相对于项目目录的Debug,Releasex64/Debug,x64/Release目录。
  • 在哪里可以查看我的目录是什么?我尝试使用指定 C:\\... 的绝对路径...我尝试使用 GetCurrentDirectory 并将文件也复制到那里...
  • 您是否尝试过编写一个非常简单的程序来读取文件?我在您的代码中没有看到任何特别错误的地方。我会用一个例子来更新我的答案。
  • 写了几行来创建一个 .txt 文件,看看它是在哪里创建的,它与我拥有该文件的同一目录中。修好了,还是不知道怎么弄把它放在问题中。谢谢大家。
【解决方案2】:

当前文件夹和文件夹的 exe 文件是不同的东西(有时)。尝试指定文件的全名(包括磁盘、所有文件夹等)。

您可以通过调用检查文件打开操作的错误

if (!DataFile) { ... }

【讨论】:

  • 他检查错误,但在错误分支中没有做任何有意义的事情。您的回答在错误分支中也没有任何意义。
【解决方案3】:

如果您使用 C 函数 fopen,您可以获得错误代码(并在互联网上获得错误描述)。如果打开失败,你会得到一个 nullptr 作为 fopen 的结果,errno 将包含错误代码。

【讨论】:

    【解决方案4】:

    std::filesystem 库可以帮助您解决文件和路径相关的问题。

    #include <filesystem>
    
    
        // (in some function)
        std::filesystem::path filepath = "alarmes.txt";
        if ( !exists(filepath) )
        {
            std::cout << "File path " << filepath << " at absolute location "
                      << absolute(filepath) << " does not exist\n";
        }
    

    See it on Compiler Explorer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 2017-11-08
      相关资源
      最近更新 更多