我正在使用C语言中的字典实现,这要求我使用单词和定义读取多行文件。我可以正确读取文件,但不是EOF,而是完全停止。用于标记文件的结尾。我试图阻止程序一旦到达文件就读取文件。但无济于事。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_WORD_SIZE 40
#define MAX_DESC_SIZE 200
int d_read_from_file(const char * filename){
char dbuffer[MAX_WORD_SIZE+MAX_DESC_SIZE+2];
char word[MAX_WORD_SIZE+1];
char meaning[MAX_DESC_SIZE+1];
int i = 0;
FILE *file = fopen(filename, "r");
if (file == 0)
{
printf("Could not open file\n");
return 0;
}
while((fgets(dbuffer, sizeof(dbuffer), file))) {
if (strcmp(word, ".") == 0) {
break;
}
sscanf(dbuffer, "%s %[^\n]",word, meaning);
printf("%s\n", word);
printf("%s\n", meaning);
}
return 1;
/* d_read_from_file(filename);*/
}
int main(int argc, char ** argv)
{
int i;
for (i=1; i<argc; i++)
d_read_from_file(argv[i]);
}
我知道代码现在看起来有点乱,但我只是试图让它一旦停止就停止。字符。
以下是输入的示例:
computer Electronic device for processing data according to instructions
playground Area of outdoor play or recreation
plateau Land area with high, level surface
aardvark Unfriendly, nocturnal mammal native to Africa
.
我从我编写的代码中得到的输出:
computer
Electronic device for processing data according to instructions
playground
Area of outdoor play or recreation
plateau
Land area with high, level surface
aardvark
Unfriendly, nocturnal mammal native to Africa
.
Unfriendly, nocturnal mammal native to Africa
它似乎在循环中再次继续使用。作为单词,然后打印出最后的意思,以便阅读。有关如何解决此问题的任何想法?如果有更有效的方式来做我正在做的事情,那么也让我知道。
答案 0 :(得分:2)
在从word
中提取之前,您正在检查dbuffer
。它仍然具有循环中最后一次的值。
由于最后一行可能包含也可能不包含换行符,因此最简单的方法是在继续之前检查dbuffer
这两个版本:
while((fgets(dbuffer, sizeof(dbuffer), file))) {
if ((strcmp(dbuffer, ".") == 0) || strcmp(dbuffer, ".\n") == 0) {
break;
}
// ...
}
答案 1 :(得分:0)
快速回答:更改:
if (strcmp(word, ".") == 0) {
break;
}
sscanf(dbuffer, "%s %[^\n]",word, meaning);
为:
sscanf(dbuffer, "%s %[^\n]",word, meaning);
if (strcmp(word, ".") == 0) {
break;
}
此外,最好检查sscanf
此处的返回值是2
,否则meaning
没有意义,并且可能会有前一个值,因为您的输出显示。如果它不是2
,并且word
不是"."
,那么您的输入文件会出现语法错误,您应该例如退出并显示错误消息。
并且,在原始代码中,word
在第一次检查时未初始化。
答案 2 :(得分:0)
sscanf(dbuffer, "%s %[^\n]",word, meaning);
printf("%s\n", word);
printf("%s\n", meaning);
在检查单词是否为"."