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

标签 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));

最佳答案

是的,可以使用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/

相关文章:

iphone - 给定文件和目录生成相对路径的 Objective-C 代码

c - 为什么我的代码之间的打印为零?

C - fgets 可以接受 NULL 参数吗?

python - 在需要 float 的 python3 中使用 ctypes 时得到 'nan'

android - 在 android 中获取 uri.parse() 的文件路径

c - 新程序员来了,这个堆栈程序有什么问题吗?

Java - 以 10 的批量读取大型 .text 数据文件

c - 如何从文件或输入中去除除十六进制以外的所有内容?

c - 使: force recompilation of same objects with different compiler

c++ - 将 double 转换为带 n 个小数位且不带尾随零的字符串