1

我正在尝试获取文件的行并将它们放入字符串数组的唯一索引中,如下所示:

char *fileString[newline_count];
        rewind(makeFile);
        int i;
        int i2 = 0;
        int i3 = 0;
        char temp[500];
        for(i = 0; i < string_size; i++){
            temp[i3] = fgetc(makeFile);
            if(temp[i3] == '\n'){
                temp[i3] = '\0';
                fileString[i2] = temp;
                i2++;
                i3 = 0;
            }else{
                i3++;
            }   
        }

        for(i = 0; i < newline_count; i++){
            printf("%s %c", fileString[i], '\n');
        }

最后一个 for 循环只打印出 fileString 的内容,它是字符串数组。i 是第一个 for 循环的索引,i2 是 fileString 的索引,而 i3 是 temp char 的索引,一旦将一行的内容放入 temp 中,它将存储到 fileString 中。我想知道为什么 fileString 的内容一遍又一遍地是最后一行。最后一个 for 循环只打印文件的最后一行,以显示文件中的行数。我完全迷路了,非常非常累,所以我在这里寻求帮助。我将非常感激。

4

3 回答 3

1

在每次迭代中,缓冲区temp被分配到 中的每个位置fileString。换句话说,数组中的所有条目都指向同一个缓冲区(其中包含最后读取的最后一行)。

一个“快速”的解决方法是将该行更改为:

fileString[i2] = strdup(temp);

如果这样做,则需要释放每个条目以避免泄漏。

于 2013-11-14T23:55:00.977 回答
1

您正在分配;temp的每个索引 fileString这会导致 的每个元素都fileString指向同一个东西——temp数组的第一个元素。由于您不断覆盖temp每一行的内容,因此当您完成读取文件时,它最终只包含最后一行。

您需要复制temp其他地方的内容(并且是唯一的)以保留它们,并指向fileString该副本,而不是您的临时temp数组。例如,在读取每一行以及从该位置到该位置的行malloc之后,新的内存足够长(一旦你完成了它就必须这样做)。一种快速的方法是使用which 与and组合基本相同,但它是一个非标准函数(因此,如果没有别的练习,请实现你自己的)。strcpytempfreestrdupmallocstrcpystrdup

于 2013-11-14T23:55:52.787 回答
1

无需读取每个单独的字符并将它们放入字符串中。使用 fgets()。我将为每一行分配内存,获取数据,然后将指向该分配数据的指针存储在某个数据结构中。

例如,

  // Allocate an array pointers, using 1000 as our initial size.
  int lineReferencesSize = 1000;
  char **lineReferences = (char **) malloc (sizeof(char *) * lineReferencesSize);
  char buf[100];

  int i = 0;
  while(fgets(buf, 100, fin)) {
    lineReferences[i] = strdup(buf);
    i++;
  }

完成后记得释放()。

现在,lineReferences 是一个固定大小的指针数组,可以存储 1000 个 char * 指针。出于严肃的目的,我会考虑一个没有任意固定大小的数据结构。您可以通过将 lineReferences 设为动态数组、在达到限制时调整其大小、realloc() 将数量翻倍并继续前进来做到这一点。有一些有趣的边缘情况需要考虑(阅读 realloc 上的手册页)。

你也可以这样写:

  // Allocate an array pointers, using 1000 as our initial size.
  char *lineReferences[1000];
  char buf[100];

  int i = 0;
  while(fgets(buf, 100, fin)) {
    lineReferences[i] = strdup(buf);
    i++;
  }

但重要的是要了解另一种形式的情况。

于 2013-11-15T00:38:36.693 回答