不知道为什么我会收到#"总线错误10"与strtok / EOF

时间:2014-04-11 00:28:06

标签: c string

我正在尝试从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条件有关?

2 个答案:

答案 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结尾的bufferstrtok_r函数需要一个有效的C风格字符串,这意味着它必须以空值终止。我想补充一下:

buffer[z] = '\0';

在内部输入循环之后应该纠正它。

修改

每次通过外部while循环也会泄漏内存。我看到内存分配但没有调用free

编辑2:

关于您的修改,fgetc()会返回int,您应该将输入变量c更改为int以匹配,以便EOF测试正常运行。