我正在尝试使用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
的指针显示为00000000
(NULL
):
std::cout << static_cast<void*>(file->_ptr) << std::endl;
更新#3:
@chux启发了我。该文件确实打开正确,因为我只是快速检查并在控制台上打印文件的内容,它根本没有失败。我错误地将file->_ptr
误解为显示NULL
为指针的“真实”值。但是,即使单步执行调试器中的代码显示为NULL
,我也可以打印文件的内容 - 它一直成功打开!
也许这个问题应该重新开始 - 或许在其他地方 - 因为我现在意识到这不是fopen
问题,而是我正在将FILE
传递给我的库。该库正在经历异常,最初引起我的注意,检查文件是否正确打开,并最终看到(在调试中)_ptr
显示为NULL
- 这对我有误导性。
多么尴尬。 :)
答案 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声明文件 存在
在打开时没有错误,使用errno
,strerror(errno)
ferror(file)
不会出现任何错误。
*file
的内容没有规范要使用的代码
最好不要编码if (file->_ptr == NULL) {
答案 2 :(得分:0)
经过一番讨论后,似乎我误解了发生的事情。
就我而言,打开文件没有问题。这可能是OggVorbis库的问题(参见原始帖子:更新:#3),或者我编译库的方法,或两者兼而有之。
对于因这个无关紧要的问题造成的任何不便,我深表歉意,但我希望有人也会因为它而学习我所学到的知识:
file->_ptr
失败,请不要检查NULL
FILE
,NULL
本身 将fopen
FILE
的库并抛出异常,请检查是否可以打开FILE
并将其内容打印到控制台这是关于我实际问题的帖子:OggVorbis ov_open() Throws Access Violation Exception