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

Copying files using fgets instead of 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() and fputs()。 如果您使用的是 POSIX 系统,您可能会发现 getline() better than fgets(), but you'd still use fputs() with it. Or you might find fread() and 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() 操作是否也成功。

请注意,与 by user2357112 一样,原始代码可以非常愉快地处理任意二进制文件(包含空字节 '[=21=]')(尽管 stdout 可能不太满意)。使用 fread()fwrite() 将完美地处理二进制文件,而文本文件的唯一问题是它们会忽略换行符并在读取时写入文本块(这通常不是实际的问题)。

是的,可以使用 fgets() 和 fputs() 编写此程序。我们知道fgets()遇到换行符或者EOF就停止读取,我们可以使用这个属性但是在这种情况下,我们不能直接使用feof()函数,否则,我们可以使用两个文件指针并做像这样:

//打开以“r”模式读取的文件<*fp>和以“w”模式写入的文件<*fp1>后。

while(1){
if(fgetc(fp)!=EOF) fseek(fp,-1,1);
else break;
fgets(buff,100,fp);
fputs(buff,fp1);}