我正在尝试从txt文档读取每一行,并将每行标记为特定数据。但是,我在循环结束时不断收到此错误“总线错误10”。我不确定为什么会发生这种情况,因为缓冲区char *具有足够的分配内存。
void* Producer(void *arg)
{
printf("\nEntered Producer\n");
int i, item, index;
index = (int)arg;
FILE *f = fopen(bookorders, "r");
char c = fgetc(f);
int z =0;
while (c!=EOF) {
char * buffer = (char *)calloc(1000, 1);
while (c!='\n') {
*(buffer+z) = c;
z++;
c = fgetc(f);
}
char * rpr;
char delim[2] = "|";
char * title = strtok_r(buffer, delim, &rpr);
title = title +1;
int leng = (int)strlen(title);
*(title+leng-1) = '\0';
double cost = atof(strtok_r(NULL, delim, &rpr));
int id = atoi(strtok_r(NULL, delim, &rpr));
char * cat_name = strtok_r(NULL, delim, &rpr);
c = fgetc(f);
printf("%c\n", c);
z = 0;
*buffer = '\0';
free(buffer);
}
fclose(f);
return NULL;
}
我在互斥锁上省略了我的代码,因为这个骨架无法启动;我想只添加相关的代码。此错误是否与while循环的EOF条件有关?
答案 0 :(得分:2)
您的代码中有大量内容可能会在缓冲区末尾运行或取消引用空指针(这可能会导致总线错误)。重写代码比列出所有错误要短,所以这里有:
char *buffer = malloc(1000);
if ( !buffer )
return NULL;
FILE *f = fopen(bookorders, "r");
int c, z;
if ( f ) for (;;)
{
for ( z = 0; z < 999 && (c = fgetc(f)) != EOF && c != '\n'; ++z )
buffer[z] = c;
if ( z == 0 && c == EOF )
break;
buffer[z] = 0;
char const delim[] = "|";
char *rpr;
char *title = strtok_r(buffer, delim, &rpr);
if ( title[0] )
{
++title;
title[strlen(title) - 1] = 0;
}
// Would be better to use `strtod` and `strtol` here
char *ptr = strtok_r(NULL, delim, &rpr);
double cost = ptr ? atof(ptr) : 0;
ptr = strtok_r(NULL, delim, &rpr);
int id = ptr ? atoi(ptr) : 0;
char * cat_name = strtok_r(NULL, delim, &rpr);
// If you want to do something with title, cost, id, cat_name, now's the chance
}
free(buffer);
fclose(f);
return NULL;
答案 1 :(得分:1)
我注意到两件事:
char buffer = malloc(sizeof(char)*1000);
您将buffer
定义为单个char
而不是指针。它应该是:
char *buffer = malloc(sizeof(char)*1000);
第二个问题是你忘记了以null结尾的buffer
。 strtok_r
函数需要一个有效的C风格字符串,这意味着它必须以空值终止。我想补充一下:
buffer[z] = '\0';
在内部输入循环之后应该纠正它。
修改强>
每次通过外部while
循环也会泄漏内存。我看到内存分配但没有调用free
。
编辑2:
关于您的修改,fgetc()
会返回int
,您应该将输入变量c
更改为int
以匹配,以便EOF测试正常运行。