第一次在这里发帖。我已经看过其他一些人的方法来做到这一点,其中一种方式几乎与我试图做的方式完全相同。但是,它对我不起作用?
#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 ......”。
有人可以帮助我吗?我做错了吗?
答案 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)
代码中存在两个问题:
在while循环中,您将相同的指针(buffer
)一遍又一遍地存储到指针数组中,您也会覆盖缓冲区内容。您应该按每个读取字符串的长度推进缓冲区指针。
在for循环中,您正在销毁实际行数并可能取消引用未初始化的指针。不要那样做。