Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将输入文件的每一行打印两次?_C_File_While Loop_Printf - Fatal编程技术网

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

C 将输入文件的每一行打印两次?,c,file,while-loop,printf,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) { // resu

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

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

这是我的主要文件:

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);
    }
}
关键是打印两次

希望这是一个简单的错误,我只是忽略了这一问题。

您可能希望:

fscanf(fp, "%c %d\n", &option, &key);
您还需要检查fscanf的返回值,以确保它等于2

在循环的第一次迭代中,换行符没有被使用

在第二次迭代中,换行符被使用并放入选项,而%d不匹配,fscanf返回1。键保持不变,这就是它再次被打印的原因

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

一般规则:总是检查返回值以确保它们是您期望的。您还违反了此规则,未能检查fopen的返回。在最坏的情况下,它什么也不做;充其量,它可以帮助您调试这样的问题

#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;
}
虽然我在结束前关闭了fp,但当程序即将退出时,这并不重要,从main返回与退出相当。如果它位于main以外的函数中,那么确保释放分配的任何资源(例如文件流fp)是非常重要的


警告:未编译的代码。警告选择器。

你能提供输入文件的样本吗?@JonathanLeffler:嗯,我想我说过了。我还认为向格式字符串中添加\n是修复主要错误的方法。呃..是的,我想你是这样做的;但《准则》比语言更响亮,并没有反映这一点。
#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;
}