2012-09-19 107 views
0

我在讀取和寫入文件時遇到問題。我從input.txt讀取數據,計算(Bytelandian問題)並將結果寫入文件。分割錯誤(核心轉儲)

如果我刪除代碼的最後一節,

/* 
    for (input_counter=0; input_counter<no_of_cases; input_counter++) 
    { 
     sprintf(buffer, "%d", max[input_counter]); 
    fputs(buffer, fw);     
    } 
    fclose(fw); 
    */ 

一切正常(除了我不能寫入文件)。但是我能夠編譯和運行代碼。

但是,在包含該代碼時,出現錯誤「分段錯誤(核心轉儲)」。任何想法可能發生什麼?

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

    int Calculate_max (int number){ 
     int counter; 
     int store[number+1]; 
     store[0] = 0; 
     if (number>=1){ 
      store[1] = 1; 
     } 
     if (number>=2){ 
      store[2] = 2; 
     } 

     for (counter=3; counter<=number; counter++){ 
      store[counter] = store [counter/2] +store[counter/3]+store[counter/4]; 
      if (store[counter]<counter){ 
       store[counter]=counter; 
      } 
     } 
     return store[number]; 
    } 

    int main(void){ 
     int no_of_cases=0; 
     int number[10]; 
     int max[10]; 
     int input_counter=0; 
     char line [ 128 ]; 
     char buffer [ 16 ]; 
     FILE *fr= fopen ("input.txt", "rt");   /* declare the file pointer */ 
     FILE *fw= fopen ("output.txt", "W+");   /* declare the file pointer */ 
     if (fr != NULL) 
     { 
      if (fgets (line, sizeof line, fr) != NULL) /* read a line */ 
     { 
      no_of_cases = atoi (line); 
      //printf("no %d \n", no_of_cases); 
     }  
     if (no_of_cases==0) 
     { 
      printf("No Cases!!"); 
     } 
     else 
     { 
      for (input_counter=0; input_counter<no_of_cases; input_counter++) 
      { 
       if (fgets (line, sizeof line, fr) != NULL) 
      { 
       number[input_counter] = atoi (line); 
       //scanf (line, number[input_counter], "%d"); 
       //printf(" %s \n " , line); 
       //fputs (line, stdout); 
      }    
      max[input_counter]= Calculate_max(number[input_counter]); 
      //fwrite(max[input_counter],sizeof(int),1,fp);   
      //fprintf(fw, "%d \n", max[input_counter]);     
      printf("%d \n", max[input_counter]);     
      }    
      } 
     fclose(fr); 
     } 
     /* 
     for (input_counter=0; input_counter<no_of_cases; input_counter++) 
     { 
      sprintf(buffer, "%d", max[input_counter]); 
     fputs(buffer, fw);     
     } 
     fclose(fw); 
     */ 
    return 0; 
    } 

新代碼:

#include<stdio.h> 
    #include <cstdlib> 
    long long Calculate_max (long long number) 
    { 
    long long counter; 
    long long store[number+1]; 
    store[0] = 0; 
    if (number>=1){ 
     store[1] = 1; 
    } 
    if (number>=2){ 
     store[2] = 2; 
    } 
    for (counter=3; counter<=number; counter++){ 
     store[counter] = store [counter/2] +store[counter/3]+store[counter/4]; 
     if (store[counter]<counter){ 
      store[counter]=counter; 
     } 
    } 
    return store[number]; 
    }   
    int main(void) 
    { 
    int no_of_cases=10; 
    long long number; 
    long long max[10]; 
int input_counter=0; 
char line [128]; 
char buffer [ 64 ]; 
FILE *fr= fopen ("input.txt", "rt");   /* declare the file pointer */ 
FILE *fw= fopen ("output.txt", "w+");   /* declare the file pointer */ 
if (fr != NULL) 
{ 
    while (fgets (line, sizeof line, fr) != NULL) 
     { 
      //number= atoll (line); 
      number=1000000000;    
      max[input_counter]= Calculate_max(number); 
      input_counter++; 
      printf("test \n"); 
     }    
    fclose(fr); 
} 
printf("writing \n"); 
no_of_cases=input_counter; 
for (input_counter=0; input_counter<no_of_cases; input_counter++) 
{ 
    sprintf(buffer, "%lld", max[input_counter]);   
    fputs(buffer, fw);     
    fputs("\n", fw);     
} 
fclose(fw); 
return 0; 
    } 
+0

從我繪製的錯誤消息你在unix。嘗試使用'gdb'調試器來逐步跟蹤程序,同時檢查正在使用的變量的值。你也可以喂入被轉儲到'gdb'中的核心,它會告訴你分割違規發生的地方。 – alk

+0

使用調試符號進行編譯,通常使用-g標誌並在調試器中運行它。這應該是非常明顯的。 – dmp

+0

現在我的答案解釋了新的代碼錯誤。 – Chimera

回答

3

你真的應該在這裏使用調試器,它會告訴你到底是哪行代碼崩潰。

我懷疑你的問題是輸出文件fw無法打開,所以致電fputs(buffer, NULL)崩潰。您應該檢查以確保文件已成功打開,如果不成功,請相應地進行保護。由於您傳遞的是無效模式字符串"W+",因此可能無法打開。由於您只需要寫入權限,因此您不需要讀寫權限(如果需要,請使用"w+"代替)。

+0

是啊!工作! 非常感謝! –

+0

歡迎來到StackOverflow!如果這解決了你的問題,你應該[接受它作爲答案](http://meta.stackexchange。COM /問題/ 5234 /如何-不接受-的回答工作)。 –

2

編輯:你的新代碼在store[0] = 0Calculate_max()功能失敗,因爲你number包含太大創建的long longs堆棧上大小的數組的值。

正如Adam在他的回答中所建議的那樣,您應該使用調試器來幫助您確定代碼導致問題的位置。我已經爲你做了這件事,所以你可以看到它是如何完成的。希望你會發現這有用。

這是一個使用GDB的調試會話。你會看到分段故障在第69行造成的:

fclose(fw); 

的解決方法是使用下面這行來打開文件:

FILE *fw= fopen ("output.txt", "w+"); 

注意,w是現在小寫。

[[email protected] ~]$ gcc -ggdb boom.c -o boom 
[[email protected] ~]$ gdb boom 
Reading symbols from /home/jrn/boom...done. 
(gdb) run 
Starting program: /home/jrn/boom 

Program received signal SIGSEGV, Segmentation fault. 
0x00c0660d in [email protected]@GLIBC_2.1() from /lib/libc.so.6 
(gdb) bt 
#0 0x00c0660d in [email protected]@GLIBC_2.1() from /lib/libc.so.6 
#1 0x08048759 in main() at boom.c:69 
+0

我更新了代碼以包含long long。 現在我在Calculate_max出現錯誤。 這個錯誤(分段錯誤)是什麼意思? –

+0

分段錯誤意味着您寫入了超出界限的內存位置(您錯誤地指向了無效地址)。見http://www.cprogramming.com/debugging/segfaults.html – Chimera

+0

如果你發現我的答案有幫助,請給予好評和/或接受的答案。這就是你如何獎勵人們在這裏幫助你。 – Chimera