我有多行文字文件。像:
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");
}
更新
我的问题与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");
}
仍然发生同样的事情。
答案 0 :(得分:2)
我认为您致电strtok_r
是错误的,请参阅手册
#include
char * strtok_r(char * s1,const char * s2,char ** s3);
要从s1获取第一个标记,将使用s1调用strtok_r() 第一个参数。来自s1的剩余令牌是通过调用获得的 strtok_r(),带有第一个参数的空指针。
答案 1 :(得分:0)
对strtok_r
的第二次和后续调用应将第一个参数设为NULL
。但是,我不确定这就是你遇到段错误的原因。
您还在更改buffer
指向
buffer = rest;
当您阅读完整个文件并再次退出fgets
行后,buffer
不再指向大小为size
的内存块。我怀疑这会导致你的段错误。
此外,通过修改buffer
,您无法free
malloc
答案 2 :(得分:0)
问题是char c[]="...";
应为char c[20]="...";