我编写了一个代码:
#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));
最佳答案
是的,可以使用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()
可以完美地处理二进制文件,而文本文件的唯一问题是它们会忽略换行符并在写入时写入文本 block 。已阅读(这通常不是实际问题)。
关于使用 fgets 而不是 fgetc 复制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53402455/