2013-10-16 180 views
0

嘿傢伙我有這樣的代碼:(IM試圖讀取一個字符串,並把它的輸出文件中)分段錯誤(核心轉儲)

#include "structs.h" 
#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    FILE* input = fopen("journal.txt", "r"); 
    FILE* output = fopen("output.txt", "w"); 
    char date[9]; 

    if(ferror(input) || ferror(output)) { 
    perror("Error opening input/output file\n"); 
    } 

    fscanf(input, "%s", date); 
    fgets(date, 9, input); 
    fputs(date, output); 
    fclose(input); 
    fclose(output); 
    return 0; 
} 

編譯正確,但在運行時,它顯示了錯誤

Segmentation fault (core dumped) 

我不知道爲什麼:(請幫助

+2

如果文件無法打開,'fopen'返回NULL。你不檢查這個。 – Zeta

+3

如果你使用'* nix',你可以使用[* gdb *](http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html) –

+2

爲什麼你首先'fscanf'ing,然後*也'* fgets'到'日期'? – Kninnug

回答

5

你需要檢查是否fopen回報NULL

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    FILE * input; 
    FILE * output; 
    char date[9]; 

    input = fopen("journal.txt", "r"); 
    if(input == NULL){ 
    perror("Could not open input file"); 
    return -1; 
    } 

    output = fopen("output.txt", "w"); 
    if(output == NULL){ 
    perror("Could not open output file"); 
    fclose(input); 
    return -1; 
    } 
/* ... snip ... */ 

您的輸入文件可能不存在。在NULL上調用ferror會導致分段錯誤。

0
#include <stdio.h> 
#include <stdlib.h> 

    int main() 
{ 
FILE* input = fopen("journal.txt", "r"); 
FILE* output = fopen("output.txt", "w"); 
char date[9]; 

if(input) 
{ 
    fscanf(input, "%s", date); 
    fgets(date, 9, input); 
} 
else 
{ 
    printf("error opening the file"); 
} 

if(output) 
{ 
    fputs(date, output); 
} 

else 
{ 
    printf("error opening the file"); 

} 

你正在接受分段錯誤,你是從一個不存在的文件「journal.txt」閱讀並呼籲FERROR觸發段錯誤。