实现一种复制功能,该功能使用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);
}
}
希望可以执行复制功能,并且上面已经提到了细节
答案 0 :(得分:2)
根据第二个问题描述,您需要使用fgetc
和fputc
,并且不需要任何缓冲区。
语法:
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>