由fopen返回的NULL指针 - 但没有错误

时间:2016-09-09 15:33:48

标签: c++ pointers null fopen

我正在尝试使用fopen打开文件。我正在使用绝对路径,文件确实存在,并且它没有损坏。此外,所有系统用户都具有读/写文件的完全访问权限。

const char* filename = "absolute\\path\\to\\file.something";
const char* mode = "rb";

FILE* file = fopen(filename, mode);

std::cout << "Errors: " << strerror(errno) << std::endl;
std::cout << "File errors: " << ferror(file) << std::endl;
perror(filename);

fclose(file);

所有错误报告都没有显示任何错误,但fopen返回空指针。如果我试图找到该文件,我会得到一个“访问冲突0x00000014,从我读过的内容来看,这意味着指针为空。 :)

错误报告:

  • strerror(errno):“没有错误”
  • ferror(file):0
  • perror(filename):“没有错误”

我可以做哪些其他错误检查?为了解决这个问题,接下来要做的是做什么?

解释为什么我将C与C ++混合: 我将使用需要FILE句柄的C库,否则我会使用fstream。所以,希望是让这个fopen工作,所以我可以将FILE传递给C库。我项目的其余部分是用C ++编写的。 :)

更新#1:

此检查对我有效:

if (file == NULL) {
    std::cout << "File is null" << std::endl;
}

此检查确实对我有用:

if (file->_ptr == NULL) {
    std::cout << "_ptr is null" << std::endl;
}

更新#2:

这会将FILE显示为 NULL

std::cout << static_cast<void*>(file) << std::endl;

这会将FILE的指针显示为00000000NULL):

std::cout << static_cast<void*>(file->_ptr) << std::endl;

更新#3:

@chux启发了我。该文件确实打开正确,因为我只是快速检查并在控制台上打印文件的内容,它根本没有失败。

我错误地将file->_ptr误解为显示NULL为指针的“真实”值。但是,即使单步执行调试器中的代码显示为NULL,我也可以打印文件的内容 - 它一直成功打开!

也许这个问题应该重新开始 - 或许在其他地方 - 因为我现在意识到这不是fopen问题,而是我正在将FILE传递给我的库。该库正在经历异常,最初引起我的注意,检查文件是否正确打开,并最终看到(在调试中)_ptr显示为NULL - 这对我有误导性。

多么尴尬。 :)

3 个答案:

答案 0 :(得分:2)

在调用任何可能改变它的函数之前,您需要保存errno

FILE* file = fopen(filename, mode);
int error_code = errno;
std::cout << "Errors: " << strerror(error_code) << std::endl;

在此特定代码中,std::cout << "Errors: "可能会更改errno

答案 1 :(得分:1)

OP的代码每comment返回一个非NULL指针,表示结果fopen()成功。

进一步的OP声明文件 存在

在打开时没有错误,使用errnostrerror(errno) ferror(file)不会出现任何错误。

*file的内容没有规范要使用的代码 最好不要编码if (file->_ptr == NULL) {

答案 2 :(得分:0)

经过一番讨论后,似乎我误解了发生的事情。

就我而言,打开文件没有问题。这可能是OggVorbis库的问题(参见原始帖子:更新:#3),或者我编译库的方法,或两者​​兼而有之。

对于因这个无关紧要的问题造成的任何不便,我深表歉意,但我希望有人也会因为它而学习我所学到的知识:

  1. 如果file->_ptr失败,请不要检查NULL FILENULL本身 fopen
  2. 如果您正在使用处理FILE的库并抛出异常,请检查是否可以打开FILE并将其内容打印到控制台
  3. 如果(测试后)您可以自己打开并阅读该文件,请将其视为库的问题
  4. 在Google上搜索有关该库的类似问题
  5. 如果搜索无法找到解决方案,那么您才应该发布问题
  6. 发布问题时,尽可能详细说明:
    • 图书馆版本
    • 应重现问题的代码片段
    • 您如何编译库的详细信息(如果您这样做)
    • IDE版
    • 操作系统和版本
    • 错误代码的详细信息
  7. 这是关于我实际问题的帖子:OggVorbis ov_open() Throws Access Violation Exception