我试图从文本文件中读取数据,并且我试图将每行文本放在指向char
的指针中。我创建了char* ligne[nl];
,其中nl
是文本行数。
问题在于,当我尝试打印文本的每个ligne[]
时,我发现ligne
值只有最后一行而不是文本的所有行。
看看代码:
首先我的文件包含以下行:
mama
kaka
sasa
我正在使用CodeBlocks C,代码是:
int main(void) {
int i=0 ,k;
char *ligne[3] = {NULL}; // three char pointer that take each ligne
char word[25] = "";
FILE* file = fopen("dico.txt", "r");
if(file != NULL){
while (fgets(word, 25, file) != NULL ){
ligne[i] = word;
i++;
}
// print each ligne of the file text
for( i =0 ; i < 3 ; i++){
printf("%s" , ligne[i]);
printf("\n");
}
}
return 0;
}
打印ligne[i]
的结果是:
sasa
sasa
sasa
而不是:
mama
kaka
sasa
我做错了什么?
答案 0 :(得分:2)
问题是你正在使ligne数组中的每个索引指向单词数组。因此,当你完成fgets while循环时,所有索引都将指向word数组中的数据,这是sasa(因为这是放入单词数组的最后一个单词,即你覆盖了其他单词) 。 一种可能的解决方案是按如下方式声明你的ligne数组:
char ligne[4][25]
。
然后调用fgets:
fgets(ligne[i], 25, file)
在while循环的每一轮。
答案 1 :(得分:1)
问题是你总是把下一个单词读成&#34; word&#34;并且你使所有你的ligne [i]元素指向同一个变量,&#34; word&#34;。如果你确实知道单词的大小和你可以做的行数:
int main( int argc, char **argv ) {
int i=0 ,k;
char ligne[4][25]; // three char pointer that take each ligne
FILE* file = fopen("dico.txt" , "r");
if(file != NULL){
while ( fgets(ligne[i] , 25 , file) != NULL ) {
i++;
}
// print each ligne of the file text
for( i =0 ; i < 3 ; i++){
printf("%s" , ligne[i]);
printf("\n");
}
} return 0;
}
请注意,ligne声明为4行。原因是在第3行之后你仍然将ligne [4]传递给fgets,即使fgets将返回NULL,你传入的指针应该是有效的。
另请注意,代码是非常危险的。我依赖的文件不超过3行,或者更确切地说,fgets为第4次调用返回NULL。这些与每个呼叫中消耗的字符数限制为每次呼叫中的24(25-1)不同。如果该假设失败,那么您将会遇到各种有趣的内存错误。
答案 2 :(得分:1)
您正在使用任何新读取覆盖先前读取的值。调试将显示每个ligne元素指向相同的内存地址。而是显式创建一个多维数组并手动引用要分配的元素。
const unsigned int NUM_LINES = 3;
int i = 0;
char *ligne[3] = { NULL }; // three char pointer that take each ligne
char word[NUM_LINES][25];
FILE* file = fopen("dico.txt", "r");
if (file != NULL)
{
while (fgets(word[i], 25, file) != NULL){
ligne[i] = word[i];
i++;
}
// print each ligne of the file text
for (i = 0; i < 3; i++)
{
printf("%s", ligne[i]);
printf("\n");
}
}
return 0;