首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fopen返回NULL,但是perror打印成功?

fopen返回NULL,但是perror打印成功?
EN

Stack Overflow用户
提问于 2011-05-13 02:16:15
回答 3查看 1.8K关注 0票数 2

好的,我有这样的代码:

代码语言:javascript
复制
if(argc>1){
           FILE * pFile = fopen(argv[1],"rb");
           perror("");
}else{
      FILE * pFile = fopen("hardcoded","rb");
}
if(pFile==NULL){
                puts("Unable to open source file");
                return -1;
}

然而,我得到了这个奇怪的输出:

代码语言:javascript
复制
Success
Unable to open source file

更奇怪的是,如果我这么做:

代码语言:javascript
复制
if(argc>1){
           FILE * pFile = fopen(argv[1],"rb");
           perror("");
}else{
      FILE * pFile = fopen("hardcoded","rb");
}
FILE * pFile = fopen("hardcoded","rb");
if(pFile==NULL){
                puts("Unable to open source file");
                return -1;
}

在存在硬编码的地方,一切都运行得很好!

大火是什么意思?

在Ubuntu上使用GCC4进行编译

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-13 02:19:11

我很惊讶你的代码能被编译,因为你声明了FILE *pFile的作用域是if和else块。如果您在此之前已经声明了它,那么删除if/else块中赋值前面的FILE*文本。

票数 5
EN

Stack Overflow用户

发布于 2011-05-13 02:20:41

不要在if语句中定义pFile,这样会失去作用域。

代码语言:javascript
复制
FILE * pFile;
if(argc>1){
           pFile = fopen(argv[1],"rb");
           perror("");
}
票数 0
EN

Stack Overflow用户

发布于 2011-05-13 02:37:31

我敢打赌,您之前的代码中有一个没有包含的FILE * pfile;。如果它在所有块之外,并且具有静态存储持续时间,则将其初始化为NULL。

当您在内部块中使用FILE * pfile = fopen(...时,这两个pfile是两个不同的东西。因此,发生了什么:

您在一个块中定义了pfile,并且可以很好地打开它。然后到达块的末尾,它就像块中的任何其他变量local一样被丢弃。

剩下的是原来的pfile,您从未打开过它,也没有给它分配过任何东西,它很可能是空的。

在第二种情况下,您打开一个文件并将其丢弃,然后在与测试if语句相同的作用域中有一个FILE * pfile,这就是您要测试的那个,所以它没有问题。

您需要做的是只定义一次pfile,因为额外的定义要么会导致编译器错误,要么会给出不同的版本。从你的内部代码块中去掉所有的FILE *,并且一直使用相同的pfile

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5982473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档