C 使用strtok_r()解析文本文件时出现分段错误
我有多行的文本文件。比如:C 使用strtok_r()解析文本文件时出现分段错误,c,parsing,strtok,C,Parsing,Strtok,我有多行的文本文件。比如: 11111111 22222222 33333333 44444444 55555555 ... 我编写了一个c代码来检索每一行。我的代码解析了所有行,并成功地将它们写入了输出控制台。但在最后一行应用程序崩溃之后。它回来了 Program received signal SIGSEGV, Segmentation fault. 为什么呢 我的C代码: FILE *fPtr; char file[]="/root/dd"; char *rest; char *t
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");
}
同样的事情也发生了。我想你打电话给strtok\u r是错误的,引用手册 #包括 char*strtok_r(char*s1,const char*s2,char**s3) 要从s1获取第一个令牌,将调用strtok_r(),并将s1作为其 第一个参数。来自s1的剩余令牌通过调用 strtok_r(),第一个参数的指针为空
对
strtok\u r
的第二次和后续调用的第一个参数应为NULL
。然而,我不确定这就是为什么你有这个毛病
您还将更改缓冲区
在行中指向的位置
buffer = rest;
读取整个文件并退出后,fgets
行再次运行,buffer
不再指向大小为size
的内存块。我怀疑这是你的错
此外,通过修改
缓冲区
,您无法释放malloc内存,问题是字符c[]=“…”的定义代码>
它应该是charc[20]=“…”
您应该在尝试使用前检查fPtr
是否为空,而不是在fseeking之后。。另外,您可以为整个文件分配空间,然后仍然使用fgets()
逐行读取。这是加载文件问题的两种不同解决方案的两个部分。size
是您期望的值吗?在使用缓冲区之前,还应检查缓冲区是否为空。