我有多行文本文件。像:使用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");
}
而且還會發生同樣的情況。
您應該檢查'fPtr'爲空*之前*您嘗試使用它,而不是在fseeking之後。 –
[不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。另外,你爲整個文件分配空間,然後使用'fgets()'逐行讀取它。對於加載文件的問題,這是兩個*不同*解決方案的兩半... – unwind
「尺寸」是您期望的值嗎?在使用之前,您還應該檢查'buffer'是否爲null。 – Steve