2013-10-08 119 views
0

我有多行文本文件。像:使用strtok_r解析文本文件時出現分段錯誤

11111111 
22222222 
33333333 
44444444 
55555555 
... 

我寫了一個c代碼來檢索每一行。我的代碼解析了所有行並將它們寫入成功輸出控制檯。但在最後一行應用程序崩潰後。它返回

Program received signal SIGSEGV, Segmentation fault. 

這是爲什麼?

我的C代碼:

FILE *fPtr; 
char file[]="/root/dd"; 

char *rest; 
char *token; 
char *buffer; 

unsigned long size; 

fPtr = fopen(file,"r"); 

fseek(fPtr, 0, SEEK_END); 
size=(unsigned long)ftell(fPtr); 
fseek(fPtr, 0, SEEK_SET); 

buffer=(char *)malloc(size);  

if(fPtr) 
{ 
    while(fgets(buffer, size, fPtr))  
    { 
     while(token = strtok_r(buffer, "\n", &rest)) 
     { 
      printf("token: %s\n", token); 
      buffer = rest; 
     } 
    } 
    fclose(fPtr); 
} 
else 
{ 
    printf("file not open \n"); 
} 

UPDATE

我變薄的問題是不是與strtok_r相關的()。因爲我更改了自己的代碼:

FILE *fPtr; 
char file[]="/root/dd"; 

char *rest; 
char *token; 
char *buffer; 

unsigned long size; 

fPtr = fopen(file,"r"); 

if(fPtr==NULL) 
{ 
    printf("null pointer\n"); 
} 

fseek(fPtr, 0, SEEK_END); 
size=(unsigned long)ftell(fPtr); 
fseek(fPtr, 0, SEEK_SET); 

buffer=(char *)malloc(size);  

if(fPtr) 
{ 
    while(fgets(buffer, size, fPtr))  
    { 
     printf("buffer: %s\n", buffer); 
    } 
    fclose(fPtr); 
} 
else 
{ 
    printf("file not open \n"); 
} 

而且還會發生同樣的情況。

+1

您應該檢查'fPtr'爲空*之前*您嘗試使用它,而不是在fseeking之後。 –

+0

[不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。另外,你爲整個文件分配空間,然後使用'fgets()'逐行讀取它。對於加載文件的問題,這是兩個*不同*解決方案的兩半... – unwind

+0

「尺寸」是您期望的值嗎?在使用之前,您還應該檢查'buffer'是否爲null。 – Steve

回答

0

問題的內存沒有free辦法是char c[]="...";

定義,它應該是char c[20]="...";

2

我想你打電話strtok_r是錯誤的,從手動

的#include報價

的char * strtok_r(字符* S1,爲const char * S2,字符** S3);

要從s1中獲取第一個令牌,strtok_r()將以s1作爲其第一個參數調用 。通過調用 strtok_r()以及第一個參數的空指針獲取s1剩餘的令牌。

0

strtok_r的第二次和後續調用應具有第一個參數NULL。不過,我不確定這是爲什麼你有段錯誤。

你也在發生變化,其中buffer點到行

buffer = rest; 

當您已經閱讀整個文件,並退出fgets線再次運行,buffer不再指向的大小size的內存塊。我懷疑這是導致你的段錯誤。

此外,通過修改buffer你有荷蘭國際集團,這是malloc