1

我正在编写代码,它非常简单地读入文件并适当地打印出文件中的内容。

我一直在努力让这样的程序在文件结束时终止,并认为我找到了合适的解决方案,但是每行在我的输出中打印两次,原因超出了我的范围。

这是我的主要文件:

int main(int argc, char *argv[]) {
    // insure 2 arguments given, one for a.out and one for the test file
    if (argc != 2) {
        // result if request fails
        printf("Requires 2 arguments. Be sure to include test file location\n");
        return 0;
    }

    FILE *fp; //open the file
    fp = fopen(argv[1], "r");

    char option;
    int key;
    int i = 0;
    while (fscanf(fp, "%c %d", &option, &key) != EOF) {
        printf("%d\n", key);
    }
}

关键是打印两次!

希望这是一个简单的错误,我只是因为过度暴露于问题而忽略了。

4

2 回答 2

0
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Requires 1 argument - a file name\n");
        return 1;
    }

    FILE *fp; //open the file
    if ((fp = fopen(argv[1], "r")) == 0)
    {
         fprintf(stderr, "Failed to open file %s\n", argv[1]);
         return 1;
    }

    char option;
    int key;
    while (fscanf(fp, "%c %d", &option, &key) == 2)
        printf("%d\n", key);
    return 0;
}

注意错误报告和文件读取过程中的变化。代码可能仍然不是您想要的;您可能会在第一行之后存储的第一行输入之后的数字之后获得换行符option。修复需要fgets()sscanf()

#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Requires 1 argument - a file name\n");
        return 1;
    }

    FILE *fp; //open the file
    if ((fp = fopen(argv[1], "r")) == 0)
    {
         fprintf(stderr, "Failed to open file %s\n", argv[1]);
         return 1;
    }
    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), fp) != 0)
    {
        char option;
        int key;
        if (fscanf(fp, "%c %d", &option, &key) == 2)
            printf("%d\n", key);
        else
        {
            fprintf(stderr, "Format mismatch on %s", buffer);
            fclose(fp);  // Not 100% necessary here, but tidiness is important
            return 1;
        }
    }
    fclose(fp);          // Not 100% necessary here, but tidiness is important.
    return 0;
}

虽然我fp在结束之前关闭了,但程序即将退出的时间并不重要,并且returnfrommain()几乎相当于exit(). 如果它在一个函数中main(),那么确保释放您分配的任何资源非常重要,例如文件流fp

警告:未编译的代码。警告讲师。

于 2012-11-27T02:25:31.517 回答
0

你可能想要:

fscanf(fp, "%c %d\n", &option, &key);

并且您还想检查 的返回值fscanf以确保它等于 2。

在循环的第一次迭代中,没有消耗换行符。

在第二次迭代中,换行符被消耗并放入option%d不匹配,并fscanf返回 1. key不变,这就是它再次打印的原因。

在第三次迭代中,fscanffinally 返回EOF

一般规则:始终检查返回值以确保它们是您所期望的。(您也违反了这条规则,因为您没有检查来自 的退货fopen。)在最坏的情况下它什么也不做;充其量,它可以帮助您调试此类问题。

于 2012-11-27T02:18:06.763 回答