使用fscanf和fprintf实现复制功能

时间:2019-06-03 10:41:21

标签: c

  1. 实现一种复制功能,该功能使用fscanf一次从输入读取一个字符,并使用fprintf一次将一个字符打印到输出。

  2. 实现一种复制功能,该功能使用fgetc一次从输入读取一个字符,并使用fputc一次将一个字符打印到输出。

    < / li>

是否可以使用不使用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);
    }
}

希望可以执行复制功能,并且上面已经提到了细节

2 个答案:

答案 0 :(得分:2)

根据第二个问题描述,您需要使用fgetcfputc,并且不需要任何缓冲区。

语法:

int fputc(int char, FILE *pointer)
int fgetc(FILE *pointer)
  

fgetc()从流中读取下一个字符,并将其作为无符号字符返回到文件int或文件或错误结束时的EOF中。

这就是为什么c被声明为int而不是char的原因。

示例:

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

答案 1 :(得分:2)

两个答案都存在问题:

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

  • 在第二个代码中,您应该使用fgetc()fputc(),而不是fgets()fputs()。这种方法只需要一个int c;

以下是更正的版本:

第一个问题:

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

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