使用 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);}
我做了一个代码:
#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()
操作是否也成功。
请注意,与 '[=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);}