如何停止在C中读取多行文件。'。'到达了?

时间:2014-04-03 18:20:41

标签: c

我正在使用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

它似乎在循环中再次继续使用。作为单词,然后打印出最后的意思,以便阅读。有关如何解决此问题的任何想法?如果有更有效的方式来做我正在做的事情,那么也让我知道。

3 个答案:

答案 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);

在检查单词是否为"."

之前,您可以扫描该单词并将其打印出来