Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C获取文件行,并将它们放在字符串数组的单独索引中_C_Arrays_String - Fatal编程技术网

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

C获取文件行,并将它们放在字符串数组的单独索引中,c,arrays,string,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(make

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

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');
        }
char*fileString[newline_count];
倒带(makeFile);
int i;
int i2=0;
int i3=0;
炭温度[500];
对于(i=0;i
最后一个for循环只是打印出fileString的内容,fileString是字符串数组。i是第一个for循环的索引,i2是fileString的索引,i3是temp char的索引,一旦一行的内容被放入temp,temp char将被存储到fileString中。 我想知道为什么文件字符串的内容是
最后一行一遍又一遍。last for循环只打印出文件的最后一行,即文件中的行数。我完全迷路了,非常非常累,所以我在这里寻求帮助。非常感谢。

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

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

fileString[i2] = strdup(temp);

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

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


您需要将
temp
的内容复制到其他地方(并且是唯一的),并将
fileString
指向该副本,而不是临时
temp
数组。例如,
malloc
在读取每一行后,创建足够长度的新内存,并
strcpy
temp
到该位置的行(完成后必须
释放
)。一个快速的方法是使用
strdup
,它与
malloc
strcpy
的组合基本相同,但它是一个非标准函数(因此,如果没有其他功能,那么为了练习,可以实现您自己的
strdup
)。

读取每个字符并将它们放入字符串是不必要的。使用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()将数量增加一倍以及继续执行来实现这一点。有一些有趣的边缘案例需要考虑(请阅读Realc的网页)。p> 您也可以这样写:

  // 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++;
  }
但了解另一种形式的情况很重要