2015-11-20 42 views
0

我试图从文本文件中读取数据,并且试图将文本的每一行放在指向char的指针中。我创建了char* ligne[nl];,其中nl是文本行的数量。尝试从文本文件中读取数据时发生的问题

问题是,当我尝试打印文本的每个ligne[]时,我发现ligne值只有最后一行而不是文本的所有行。 看看代码:

首先我的文件中的文本包含这些行:

mama 
kaka 
sasa 

我使用的代码块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 

我在做什么错?

+3

这是C还是C++?如果它是纯C代码,则删除C++标记。 – Slava

+0

好吧,你对了 –

回答

2

问题是您正在将ligne数组中的每个索引指向字数组。因此,当您完成fgets while循环时,所有索引都将指向数组中的数据,这是sasa(因为这是放入字数组中的最后一个字,即您覆盖了其他字) 。 可能的解决方案是声明您的ligne阵列如下:

char ligne[4][25]

然后调用与fgets这样:

fgets(ligne[i], 25, file)

在每一轮while循环的。

+0

你也可以使用'fgets(ligne [i],sizeof(ligne [i]),file)''。 –

+0

exelent这是工作良好,非常感谢你 –

+0

waw完美我了解你的建议,你说,在循环结束while(fgts!= NULL)时,ligne数组包含最后一个值,这是字[25]! (y) –

1

问题是,你总是读下一个单词到“单词”,你让所有的ligne [i]元素指向相同的变量,“单词”。如果您确实知道单词的大小和您可以执行的行数:

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行。原因是在第三行之后,你仍然将ligne [4]传递给fgets,即使fgets将返回NULL,你传入的指针应该是有效的。

另请注意,代码是非常危险的。我依赖的文件没有超过3行,或者更确切地说,fgets返回NULL为第4次调用。这些不同于每次通话中消耗的字符数限制在每个通话中的24(25-1)。如果这个假设失败了,那么你会有各种有趣的记忆错误。

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; 
+0

哇,这也是完美的工作谢谢你 –

相关问题