C取文件行并将它们放入字符串数组的单独索引中

时间:2013-11-14 23:50:01

标签: c arrays string

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

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循环只打印出文件的最后一行,表示文件中的行数。我完全失去了,非常累,所以我在这里寻求帮助。我非常感激。

3 个答案:

答案 0 :(得分:1)

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

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

fileString[i2] = strdup(temp);

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

答案 1 :(得分:1)

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

您需要将temp的内容复制到其他地方(并且是唯一的)以保留它们,并将fileString指向该副本,而不是指向您的临时temp数组。例如,malloc在读取每一行后有足够长度的新内存,strcpytemp到该位置的行free一旦完成,就必须strdup )。一种快捷的方法是使用与mallocstrcpy基本相同的strdup,但它是一个非标准函数(因此,如果没有别的话,请实施自己的{{1}})。

答案 2 :(得分: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++;
  }

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