逐行读取,seg故障

时间:2012-06-08 15:58:38

标签: c segmentation-fault

这段代码给出了一个即时的seg错误,我尝试将printf全部放在一边,我甚至尝试在int = 0之后打印一些东西;但无论我做了什么,它都不会打印除了分段错误之外的任何内容。该文件存在,其位置与我执行的位置相同。 该文件包含城市名称,每行一个名称,没有别的,我如何阅读它们并将它们存储在一个数组中:/ 如果每个城市之后有一个数字,那么阅读是否仍然相同?

NewYork 5
LosAngeles 12
California 7

和代码;

    int i=0;

    char **city_names = malloc(sizeof(char*));

    FILE* fp;
    fp = fopen("abc.txt","r");

    while(!feof(fp)){

        city_names[i] = realloc(city_names[i],sizeof(char)*255);
        fscanf(fp,"%s",city_names[i]);
        i++;
    }

    fclose(fp);

3 个答案:

答案 0 :(得分:2)

你只是在malloc中分配一个内存char *,然后在while循环中访问它。

如果你要做一个2D malloc数组,你需要malloc每个指针,然后malloc为每个指定最大字符串大小malloc(呸)。

char **city_names = malloc(sizeof(char *) * kNumCities);

for(int i = 0; i < kNumCities; i++)
  city_names[i] = malloc(sizeof(char) * kMaxStringSize);

或者执行类似char city_name[3][256]之类的操作,以启动并运行。

我还想补充一点,这种阅读非常不安全。您正在将未知数量的字节读入固定缓冲区大小。如果您读入的字符串超过255个字节,则会破坏内存。你最好将fread()用于固定大小的缓冲区类型解决方案(或ftell()然后文件并立即读取它以获得最佳效率)然后从缓冲区读取。更不用说mallocrealloc的所有开销(他们确实加起来)。

答案 1 :(得分:1)

while(!feof(fp))逻辑也是错误的;对于一个空文件,它仍然会尝试扫描某些内容并递增i

在读C之前不要测试EOF。阅读后测试。

迭代C中stdin上的字符的惯用代码是

int c; /* NOT char. */

while ((c = getchar()) != EOF) {
  /* do something with c */
}

迭代线:

char line[MAXLINE];
while (fgets (line, sizeof line, stdin) != NULL) {
   /* do something with line */
}

答案 2 :(得分:1)

    int i=0;
    char **city_names = malloc(sizeof(char*));
    FILE* fp;
    fp = fopen("data.txt","r");

    while(!feof(fp)){
        city_names[i] = (char*)malloc(sizeof(char)*255);
        if(1!=fscanf(fp,"%s %*d",city_names[i]))break;
        ++i;
        city_names = (char**)realloc(city_names, (i+1)*sizeof(char*));
    }

    fclose(fp);