尝试从文本文件中读取数据时出现问题

时间:2015-11-20 02:56:25

标签: c

我试图从文本文件中读取数据,并且我试图将每行文本放在指向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

我做错了什么?

3 个答案:

答案 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;