fopen возвращает NULL, но perror печатает Success? - PullRequest
2 голосов
/ 12 мая 2011

Хорошо, у меня есть этот код:

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

Там, где существует жесткий код, все отлично работает!

Что, черт возьми, это значит?

Компиляция с GCC4 в Ubuntu

Ответы [ 3 ]

5 голосов
/ 12 мая 2011

Я удивлен, что ваш код компилируется, так как вы объявляете FILE *pFile, ограниченную блоками if и else.Если вы объявили это до этого, то удалите текст FILE* перед назначениями в блоках if / else.

0 голосов
/ 12 мая 2011

Держу пари, у вас есть FILE * pfile; ранее в вашем коде, который вы не включили. Если он находится вне всех блоков и имеет статическую продолжительность хранения, он инициализируется значением NULL.

Когда у вас есть FILE * pfile = fopen(... во внутреннем блоке, два pfile это две разные вещи. Поэтому, что происходит:

Вы определяете pfile в блоке и прекрасно его открываете. Затем вы достигаете конца блока, и он сбрасывается, как и любая другая локальная переменная в блоке.

У вас остался исходный pfile, который вы никогда не открывали и не назначали ничего, и это, вероятно, будет NULL.

Во втором случае вы открываете файл и удаляете его, а затем у вас есть FILE * pfile в той же области, что и оператор тестирования if, и это тот, который вы тестируете, так что все в порядке .

Что вам нужно сделать, это определить pfile только один раз, так как дополнительные определения могут вызвать ошибки компилятора или предоставить вам отдельные версии. Извлеките все FILE * из своих внутренних блоков и просто все время пользуйтесь одним и тем же pfile.

0 голосов
/ 12 мая 2011

Не определяйте pFile в операторе if, вы теряете область действия.

FILE * pFile;
if(argc>1){
           pFile = fopen(argv[1],"rb");
           perror("");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...