我写了一个代码:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char * argv[]) // taking files
{
FILE * fp;
FILE * fp2;
int c;
.
. // checking possible problems
.
while ( (c = fgetc(fp)) != EOF){ // copying one file to another one
fputc (c, stdout);
fputc (c, fp2);
}
fclose(fp);
fclose(fp2);
fp = NULL;
fp2 = NULL;
return EXIT_SUCCESS;
}
我会问你,是否可以使用fgets
函数而不是fgetc
-来使while语句相同,例如:
fgets(fp, sizeof(fp), stdin));
答案 0 :(得分:1)
是的,可以使用fgets()
和fputs()
。
如果您使用的是POSIX系统,您可能会发现getline()
比fgets()
更好,但是您仍然可以使用fputs()
。或者,您可能会发现fread()
和fwrite()
合适。所有这些都在数组上起作用-您可以选择大小,您很可能会使用4096字节作为缓冲区大小。
例如:
char buffer[4096];
while (fgets(buffer, sizeof(buffer), fp) != NULL)
{
fputs(buffer, stdout);
fputs(buffer, fp2);
}
或者:
char buffer[4096];
size_t nbytes;
while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp)) > 0)
{
fwrite(buffer, sizeof(char), nbytes, stdout);
fwrite(buffer, sizeof(char), nbytes, fp2);
}
警告:未编译的代码。
请注意,从理论上讲,您应该测试fwrite()
操作是否正常(没有简短写入)。生产质量代码可以做到这一点。您还应该检查fputs()
操作是否也成功。
请注意,就像hinted at乘user2357112一样,原始代码可以很愉快地处理任意二进制文件(包含空字节'\0'
)(尽管stdout
可能会不愉快用它)。使用fread()
和fwrite()
可以完美地与二进制文件配合使用,而文本文件的唯一问题是它们将忽略换行符并在读取时写入文本块(通常这不是实际的问题)。