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