C:将(文本)文件读入数组,看不出有什么问题?

时间:2013-01-26 11:00:13

标签: c arrays file file-read

第一次在这里发帖。我已经看过其他一些人的方法来做到这一点,其中一种方式几乎与我试图做的方式完全相同。但是,它对我不起作用?

#include<stdio.h>
int main()
{

FILE *file;
char buffer[15];
char *text[12];

file = fopen("Text.txt", "r");

if(!file) {
    printf("Failed");
    return 1;
}


int count = 0;
while(fgets(buffer,sizeof buffer, file) != NULL) {
    printf("%s", buffer);
    text[count] = buffer;
    count++;
}   
printf("\n");
for (count=0;count<10;count++) {
    printf("%s\n", text[count]);
}

fclose(file);

return 0;

}

现在在另一个网站上(在寻找解决方案或帮助时,我找到了这个http://www.daniweb.com/software-development/c/threads/316766/storing-string-in-a-array-reading-from-text-file

这个人以与我相同的方式完成它(除了他们正在阅读的内容之间存在明显的细微差别等)。

我的文字文件为: 该 快 棕色 狐狸 跳 过度 该 懒 狗(全部都在自己的路上)。

基本上我想逐行读取文件并将每行保存在数组的下一个空格中。

在我使用该行的代码中     printf(“%s”,缓冲区); 它打印出每行的每个单词都可以控制到控制台窗口。 但是,当我使用for循环打印出数组的内容时,它只是为数组中的每个空格打印出“dog,dog,dog ......”。

有人可以帮助我吗?我做错了吗?

3 个答案:

答案 0 :(得分:1)

buffer始终是相同的地址,因此数组text的所有元素都包含相同的指针(或未初始化)。

您应该考虑(假设POSIX系统):

  • 通过归零来初始化所有数组(并初始化所有指向NULL的指针),例如: memset(buffer, 0, sizeof(buffer));(对于你的行缓冲区,也要在循环结束时清除它)。

  • 使用strdup复制读取字符串,即代码

    text[count] = strdup(buffer);
    

    并且在适当的时候不要忘记free。实际上,您应该通过返回strdup指针来检查NULL没有失败。

  • 使用getline读取一行(不要忘记初始化指针,可能是NULL,最后是free

  • 使用换行符printf结束您的\n格式字符串,或者在任何输入之前调用fflush

  • 使用错误代码errno显示更好的错误消息。或者只需拨打perror就好了

    file = fopen("Text.txt", "r");
    if (!file) {
      perror("fopen Text.txt failed");
      exit (EXIT_FAILURE);
    }
    

习惯使用所有警告和调试信息进行编译(例如Linux上的gcc -Wall -g)并学习如何使用调试器(例如gdb),特别是尝试逐行运行程序。 / p>

您可能对编码严格(非POSIX)但纯C2011标准感兴趣。但是,你使用许多POSIX函数(如strdup等)的自由度要低得多。我将无聊的练习留给了严格符合C99规范的代码(请记住,C99甚至不知道目录并假设几乎是“扁平”文件系统),因为我是Posix和Linux粉丝而不关心非Posix系统(特别是我不关心,自1990年以来没有使用Windows或Microsoft系统。)

另外,尝试阅读一些自由软件项目的代码(例如来自freecode)。你会学到很多东西

答案 1 :(得分:1)

您尚未为text分配任何内存。并且您必须复制buffer的值,因为它在每次迭代中都会发生变化。类似的东西:

while(fgets(buffer,sizeof buffer, file) != NULL) {
    printf("%s", buffer);
    text[count] = malloc(strlen(buffer) + 1);
    strcpy(text[count], buffer);
    count++;
}   

另外,检查malloc的返回值是否存在分配失败。

答案 2 :(得分:0)

代码中存在两个问题:

  1. 在while循环中,您将相同的指针(buffer)一遍又一遍地存储到指针数组中,您也会覆盖缓冲区内容。您应该按每个读取字符串的长度推进缓冲区指针。

  2. 在for循环中,您正在销毁实际行数并可能取消引用未初始化的指针。不要那样做。