打印出输入文件的每一行两次?

时间:2012-11-27 02:08:29

标签: c file while-loop printf

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

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

这是我的主要文件:

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);
    }
}

关键是打印两次!

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

2 个答案:

答案 0 :(得分:0)

你可能想要:

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

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

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

在第二次迭代中,新行被使用并放入option%d不匹配,fscanf返回1. key不变,这是为什么再次打印出来。

在第三次迭代中,fscanf最终返回EOF

一般规则:始终检查返回值以确保它们符合您的预期。 (你也没有检查fopen的回复而违反了这条规则。)最糟糕的是它没有做任何事情;充其量,它可以帮助您调试这样的问题。

答案 1 :(得分: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,但在程序即将退出时并不重要,而return的{​​{1}}几乎与main()相当。如果它位于exit()以外的函数中,则确保释放您分配的任何资源非常重要,例如文件流main()

警告:未编译的代码。警告Lector。