2016-06-11 7 views
0

Пожалуйста, посмотрите на следующий код:Почему fclose() не работает?

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 


void main() { 

    struct stat file_st; 
    int size=0, ret=0; 
    char* buf=NULL; 
    FILE* file = fopen("newfile", "r"); 
    if (file==NULL) { 
     printf("error"); 
     exit(1); 
    } 

    if (stat("newfile", &file_st)!=0) { 
     printf("stat failed\n"); 
     exit(1); 
    } 
    buf = (char*)malloc(sizeof(file_st.st_size+1)); 
    buf[file_st.st_size]='\0'; 
    ret = fread(buf, 1, file_st.st_size, file); 
    printf("fread return value is: %d\n"); 
    ret = fclose(file); 
    printf("fclose return value: %d\n", ret); 
    printf("%s\n", buf); 

} 

Этот код проходит компиляцию, но происходит сбой во время работы. Ты знаешь почему?

Однако, если я переключаюсь между fclose() и printf() (последние две строки кода), тогда код запускается успешно и печатает содержимое «нового файла». В чем разница между этими двумя случаями?

+0

Почему бы не проверить возвращаемое значение из 'fopen' –

+1

' void main' является неправильным. – melpomene

+0

Также используйте 'fstat (fileno (файл) и файл_st);' –

ответ

0

Хороший компилятор расскажет вам хотя бы о одной ошибке в коде. От gcc -Wall -O:

a.c:24:5: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=] 
    printf("fread return value is: %d\n"); 
    ^

В зависимости от среды, опуская аргумент для printf может привести к печати мусора, врезаться, чтобы печатать мусор и зависание, не печатать ничего, не печатать ничего и зависание, или либо печать мусора или ничего и оставить память программы в коррумпированном состоянии, чтобы определенные операции потерпели неудачу. В частности, возможно, что отсутствующий аргумент вызывает сбой fclose, но если вы вызовете printf между ними, это восстановит память программы до допустимого состояния. Невозможно точно сказать, что происходит, потому что все зависит от того, как устроена программа в памяти и как это соответствует ожиданиям операционной системы и как работает компилятор. В C, когда что-то идет не так, все ставки отключены.

0
buf = (char*)malloc(sizeof(file_st.st_size+1)); 

Удалить из этого выражения оператор sizeof. Я удивлен, что он компилируется. Он возвращает размер int, который равен 4 или 8. Не размер файла. Вы перекрываете буфер.

Кроме того, печать возвращаемого значения fclose() бесполезна. Вам нужно распечатать errno или strerror(), если он возвращает отказ.

 Смежные вопросы

  • Нет связанных вопросов^_^