fopen返回NULL,但perror会打印成功吗?

时间:2011-05-12 18:16:15

标签: c

是的,我有这段代码:

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;
}

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

Success
Unable to open source file

很奇怪,如果我这样做:

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进行编译

3 个答案:

答案 0 :(得分:5)

我很惊讶你的代码编译,因为你声明FILE *pFile作用于if和else块。如果您之前已声明,请删除if / else块中作业前面的FILE*文本。

答案 1 :(得分:0)

不要在if语句中定义pFile,否则会失去范围。

FILE * pFile;
if(argc>1){
           pFile = fopen(argv[1],"rb");
           perror("");
}

答案 2 :(得分:0)

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

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

您在一个区块中定义pfile,并将其打开。然后到达块的末尾,它就像块中的任何其他变量一样被丢弃。

你留下的原始pfile,你从未打开或分配任何内容,而且可能是NULL。

在第二种情况下,您打开一个文件并将其丢弃,然后您的FILE * pfile与测试if语句的范围相同,那就是您正在测试的文件,所以没关系。

您需要做的只是定义pfile一次,因为其他定义会导致编译器错误或为您提供单独的版本。从内部块中取出所有FILE *,并始终使用相同的pfile