使用fscanf和fprintf实现复制功能

使用fscanf和fprintf实现复制功能,c,C,执行复制功能,该功能使用fscanf从输入中一次读取一个字符,并使用fprintf从输出中一次打印一个字符 实现复制功能,该功能使用fgetc从输入中一次读取一个字符,并使用fputc从输出中一次打印一个字符 没有使用c[BUFSIZ]我还有其他方法可以做到这一点吗 以下是我尝试编写的代码: 第一个问题: static void copy(FILE *input, FILE *output) { char c = 0; while (fscanf(input, "%c", &am

执行复制功能,该功能使用
fscanf
从输入中一次读取一个字符,并使用
fprintf
从输出中一次打印一个字符

  • 实现复制功能,该功能使用
    fgetc
    从输入中一次读取一个字符,并使用
    fputc
    从输出中一次打印一个字符


  • 没有使用
    c[BUFSIZ]
    我还有其他方法可以做到这一点吗

    以下是我尝试编写的代码:

    第一个问题:

    static void copy(FILE *input, FILE *output) {
        char c = 0;
        while (fscanf(input, "%c", &c) != 0) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c[BUFSIZ];
        while (fgets(c, BUFSIZ, input) != NULL) {
            fputs(c, output);
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c;
        while (fscanf(input, "%c", &c) == 1) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        int c;
        while ((c = fgetc(input)) != EOF) {
            fputc(c, output);
        }
    }
    
    第二个问题:

    static void copy(FILE *input, FILE *output) {
        char c = 0;
        while (fscanf(input, "%c", &c) != 0) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c[BUFSIZ];
        while (fgets(c, BUFSIZ, input) != NULL) {
            fputs(c, output);
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c;
        while (fscanf(input, "%c", &c) == 1) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        int c;
        while ((c = fgetc(input)) != EOF) {
            fputc(c, output);
        }
    }
    

    根据您的第二个问题描述,您需要使用
    fgetc
    fputc
    ,而不需要任何缓冲区,它将执行上述复制功能和详细信息

    语法:

    int fputc(int char, FILE *pointer)
    int fgetc(FILE *pointer)
    
    static void copy (FILE *input, FILE *output)
    {
        int c;
        while ((c = fgetc(input)) != EOF){
            fputc(c, output);
        }
    } 
    
    fgetc()
    读取流中的下一个字符,并将其作为无符号字符转换返回到文件或错误末尾的
    int
    EOF

    这就是为什么
    c
    被声明为
    int
    而不是
    char

    示例:

    int fputc(int char, FILE *pointer)
    int fgetc(FILE *pointer)
    
    static void copy (FILE *input, FILE *output)
    {
        int c;
        while ((c = fgetc(input)) != EOF){
            fputc(c, output);
        }
    } 
    

    两种答案都有问题:

    • 在第一个代码中,测试
      fscanf()
      是否返回非零。您应该改为测试它是否返回
      1
      ,这表示已成功读取字符。实际上,在文件的末尾,
      fscanf()
      将返回
      EOF
      ,它也是非零的

    • 在第二个代码中,应该使用
      fgetc()
      fputc()
      ,而不是
      fgets()
      fputs()
      。单个
      intc

    以下是更正版本:

    第一个问题:

    static void copy(FILE *input, FILE *output) {
        char c = 0;
        while (fscanf(input, "%c", &c) != 0) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c[BUFSIZ];
        while (fgets(c, BUFSIZ, input) != NULL) {
            fputs(c, output);
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c;
        while (fscanf(input, "%c", &c) == 1) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        int c;
        while ((c = fgetc(input)) != EOF) {
            fputc(c, output);
        }
    }
    
    第二个问题:

    static void copy(FILE *input, FILE *output) {
        char c = 0;
        while (fscanf(input, "%c", &c) != 0) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c[BUFSIZ];
        while (fgets(c, BUFSIZ, input) != NULL) {
            fputs(c, output);
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        char c;
        while (fscanf(input, "%c", &c) == 1) {
            fprintf(output, "%c", c);   
        }
    }
    
    static void copy(FILE *input, FILE *output) {
        int c;
        while ((c = fgetc(input)) != EOF) {
            fputc(c, output);
        }
    }
    

    请注意,对于
    fscanf()
    版本,
    c
    必须定义为
    char
    ,对于
    fgetc()
    方法,必须定义为
    int
    fgetc()
    返回一个
    int
    ,其值为负值
    EOF
    表示文件结束或输入错误,或者从流中读取的字节值为
    无符号字符

    有什么问题吗?对于第二个问题,您不应该使用
    fgetc
    fputc
    ?“不使用
    c[BUFSIZ]
    ”…是的-它说的是“一次一个字符”。不需要数组。请阅读fgetc(3)和fputc(3)手册页,您会发现没有
    char
    类型。我很困惑,如果没有数组
    int-inp=fgetc(输入);fputc(输入,输出),我怎么能做到这一点
    我想强调一下为什么
    c
    不是
    char
    会对OP有帮助。@Mayur我想OP是使用纯ASCII,否则应该有一个额外的
    unicode
    标记或描述。明白了!但是我的fscanf和fprintf仍然不起作用,有人能帮我一下吗?@Bett你认为评论部分输入了XIGS吗?