1

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

#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 -文件

这个人的做法和我一样(除了他们正在阅读的内容有明显的细微差别等)。

我的文本文件内容为: The Quick Brown Fox Jumps Over The Lazy Dog (all on their own line)。

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

在我使用行 printf("%s", buffer); 的代码中 它在控制台窗口中打印出每一行的每个单词。但是,当我使用 for 循环打印出数组的内容时,它只是为数组中的每个空间打印出“狗,狗,狗……”。

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

4

3 回答 3

1

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

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

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

  • strdup用ie代码复制读取的字符串

    text[count] = strdup(buffer);
    

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

  • 使用getline读取一行(不要忘记初始化指针,也许是指向NULL并最终指向free它)。

  • printf用换行符\n或 call结束格式化字符串fflush,特别是在任何输入之前。

  • 使用错误代码errno显示更好的错误消息。或者perror像这样打电话

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

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

您可能对编写严格(非 POSIX)但简单的 C2011 标准感兴趣。strdup但是,您使用许多 POSIX 函数(如等...)的自由度要小得多。我将无聊的练习留给读者编写严格遵守 C99 的代码(请记住,C99 甚至不知道目录,并假设几乎是“平面”文件系统),因为我是 Posix 和 Linux 粉丝并且不关心非 Posix 系统(特别是我不在乎,自 1990 年以来就没有使用 Windows 或 Microsoft 系统)。

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

于 2013-01-26T11:02:57.187 回答
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 的返回值是否分配失败。

于 2013-01-26T11:03:11.627 回答
0

代码中有两个问题:

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

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

于 2013-01-26T11:05:35.263 回答