将数据从文件放入C中的数组

时间:2013-02-18 16:17:02

标签: c arrays file

这是我的代码。

#include <stdlib.h>
#include <stdio.h>

int main() {
    //Vars
    FILE *fp;
    char word[9999],
        *arrayOfWords[9999];
    int wordCount = 0, i;
    //Actions
    fp = fopen("data.txt", "r");
    if(fp != NULL) {
        while(!feof(fp)) {
            fscanf(fp, "%s", word);
            arrayOfWords[wordCount] = word;
            wordCount++;
        }
        for(i = 0; i < wordCount; i++) {
            printf("%s \n", arrayOfWords[i]);
        }
    puts("");
    } else {
        puts("Cannot read the file!");
    }
    return 0;
}

我正在尝试从文本文件中读取一些数据并将其存储到数组中。 我在循环中时一切都很好,但是当我离开那里时,我的数组中任何索引的任何值都填充了文件的最后一个单词。谁能帮助我找出我正在做的错误?

数据文件:

Hello there, this is a new file.

结果:

file.
file.
file.
file.
file.
file.
file.
file.

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

您需要为数组的每个成员分配内存(使用malloc或通过给出数组的第二维并声明类型为char而不是char*)。你做的是类似的:

char *s;
scanf("%s", s);

这在C中无效。实际上你在这里有UB(未定义的行为),因为指针没有被初始化。

编辑:你得到数组中的所有字段指向你的数组word,一旦你读完了字,就应该为字符串分配新的内存然后strcpy word进入它。

答案 1 :(得分:1)

您的代码中至少有两个值得关注的问题。 char word[9999], *arrayOfWords[9999];arrayOfWords定义为9999 char pointers的数组。这是一个值得关注的问题。

另一点是arrayOfWords[wordCount] = word;。这里存储新读取的单词,需要分配空间,因为arrayOfWords是一个指针数组。请在下面找到修改后的代码。

int main() {
//Vars
FILE *fp;
char arrayOfWords[30];
int wordCount = 0, i;
//Actions
fp = fopen("data.txt", "r");
if(fp != NULL) {
    while(!feof(fp)) {
        fscanf(fp, "%s", &arrayOfWords[wordCount]);
        wordCount++;
    }
    puts("");
    for(i = 0; i < (wordCount - 1); i++) {
        puts(arrayOfWords[i]);
    }
puts("");
} else {
    puts("Cannot read the file!");
}
return 0;
}

答案 2 :(得分:0)

此:

arrayOfWords[wordCount] = word;

不会将当前单词复制到单独的存储中,它只会指定另一个指针指向word所执行的同一存储空间。所以最终会得到一个指向同一word数组的指针数组。您需要为每个单词单独分配内存并复制构成每个单词的字符(和NULL终止符),而不是指针。