使用fgets而不是fgetc复制文件?

时间:2018-11-20 22:19:50

标签: c file fgets fgetc

我写了一个代码:

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

1 个答案:

答案 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 atuser2357112一样,原始代码可以很愉快地处理任意二进制文件(包含空字节'\0')(尽管stdout可能会不愉快用它)。使用fread()fwrite()可以完美地与二进制文件配合使用,而文本文件的唯一问题是它们将忽略换行符并在读取时写入文本块(通常这不是实际的问题)。