【问题标题】:fstream fails to open filefstream 无法打开文件
【发布时间】:2020-11-11 11:49:41
【问题描述】:

我有一个非常奇怪的问题。设置如下:

库 A 使用库 B

两个库都作为共享库独立安装,A 使用 CMake 包链接到 B。

当我创建一个直接链接到 B 的可执行文件时,一切正常。 但是,当我创建一个链接到 A 的可执行文件(使用 B)时,由于某种原因,我在 B 中的 fstream 无法打开特定文件。我 100% 确定该文件存在,不需要授权且当前未使用。 strerror(errno) 抛出的错误是“No such file or directory”。

我真的不知道会出什么问题。这是我用来打开的代码sn-p:

ifstream f;
f.open(filename.c_str(), ios_base::in|ios::binary);
if (f.fail()) {
    std::cout << "Opening Vocabulary failed: " << std::strerror(errno) << std::endl;
    return false;
}

我三次检查了文件名中的路径是否正确。这些是我能想到的最后手段:

  • 也许库 A 使用另一个 C++ 标准作为 B,这就是对 fstream 的调用失败的原因?
  • 也许文件名字符串以某种方式损坏,即使路径似乎是正确的?
  • 也许一些内存泄漏损坏了我的 c_str() 命令?

还有什么我可以检查的吗?

编辑:啊,我忘记了一件事:fstream 命令位于头文件的模板函数中。也许这与它有关?

Edit2:这是堆栈跟踪。 “ORBVoc.bin”是我要打开的文件。我从中得到的唯一信息是,它不存在……尽管它确实存在。

https://www.file-upload.net/download-14359408/strace.log.html

【问题讨论】:

  • std::cout &lt;&lt; filenameif (f.fail()) 中打印正确的文件名吗? filename 是什么?它是如何通过的?
  • 如果是在linux下,运行strace下的可执行文件,看看会发生什么。
  • @Evg: filename 打印正确的绝对路径。文件名是一个 std::string 并且由 const & 传递。
  • 此问题显示的代码不符合 stackoverflow.com 对 minimal reproducible example 的要求。这意味着这里的任何人都不太可能最终回答这个问题。但最多只能猜测。你应该edit你的问题来展示一个最小的例子,不超过一两页代码(“最小”部分),其他人都可以剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
  • 所以,好吧,我们无能为力。您的内核告诉您该文件不存在但您说它存在 - 我会相信您的内核。可能是您的进程无权访问任何目录或文件。或者文件不存在。

标签: c++ fstream


【解决方案1】:

好的,显然只需要重新启动即可。今天一切都完美无缺。没有更改权限、文件或代码行。当我的笔记本电脑从休眠状态回来时,我认为要么出现了严重错误。或者它是一些待处理的 ubuntu 更新?我真的不知道。我可以发誓它在过去的 2-3 天内至少关闭了一次。但是,天哪,我没有其他解释。也许更聪明的人可以用他的玻璃球回答这个问题......

无论如何,感谢您的回答,不胜感激!至少我了解了 strace $:^)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多