我正在尝试获取文件的行并将它们放入字符串数组的唯一索引中:
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循环只打印出文件的最后一行,表示文件中的行数。我完全失去了,非常累,所以我在这里寻求帮助。我非常感激。
答案 0 :(得分:1)
在每次迭代中,缓冲区temp
被分配给fileString
中的每个位置。换句话说,数组中的所有条目都指向同一个缓冲区(包含最后一行读取的内容)。
“快速”解决方法是将该行更改为:
fileString[i2] = strdup(temp);
如果这样做,您需要释放每个条目以避免泄漏。
答案 1 :(得分:1)
您要为temp
的每个索引分配fileString
;这会导致fileString
的每个元素指向同一个东西 - temp
数组的第一个元素。由于您不断覆盖每个新行的temp
内容,因此在您阅读完文件后,它最终只包含最后一行。
您需要将temp
的内容复制到其他地方(并且是唯一的)以保留它们,并将fileString
指向该副本,而不是指向您的临时temp
数组。例如,malloc
在读取每一行后有足够长度的新内存,strcpy
从temp
到该位置的行free
一旦完成,就必须strdup
)。一种快捷的方法是使用与malloc
和strcpy
基本相同的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++;
}
但了解另一种形式的情况非常重要。