标准I/O
目录
区别
代码编写
验证
代码如下
利用fopen/fwrite/fclose/fprintf函数实现文件内容复制
区别
下面编写内容没有使用fseek函数
,因为fread
和fwrite
都会自动跟踪读写位置。 fread
从源文件读取数据并将文件指针后移,fwrite
将读取的数据写入目标文件并将目标文件指针后移。这样,每次读取和写入都会在正确的位置进行,无需使用fseek
来手动定位文件指针;
read和write函数时,它们并不会自动跟踪读写位置。每次调用read或write都会从文件或设备中读取或写入指定的字节数,而不考虑之前的读写位置。如果需要实现随机读写,需要结合lseek函数使用
代码编写
第4行定义一个全局的常量,可以在整个程序中使用,而且可以减少代码中的硬编码,方便维护和修改。如果在函数内定义变量是局部变量,只能在函数内使用,函数结束后就会被销毁,不能在其他函数中使用。而且每次调用函数时都会分配一次内存,会增加开销,降低程序性能。
12-16行,判断命令行传参是否相等
18-27行,用只读打开源文件,用创建和追加的方式打开目标文件,如果目标文件不存在就创建,如果目标文件存在就在该文件中的文件内容尾进行内容追加,fprintf
函数将格式化后的字符串输出到指定的文件流中,而stderr
是C语言标准库中的一个预定义文件流,代表标准错误输出流,最后将格式化后的字符串输出到标准错误输出流中,显示给用户在终端上
29行,从源文件中读取BUFFER_SIZE字节的数据,每次读取1字节,读取的数据存放在buffer缓冲区中,并返回实际读取的数据块数量
31行,buffer
指向的是源文件中读取到的数据块,也就是要写入到目标文件中的数据。bytes_read
是指实际读取到的数据块字节数,它可能小于 BUFFER_SIZE
,所以这里使用 bytes_read
作为第三个参数,以确保只写入实际读取到的数据块。第二个参数 1
表示每个数据块的字节数为 1
32-36行,如果写入的数量比读取的数量少说明出错了,就打印提示
40-45行,分别关闭文件,打印写入,退出
验证
创建一个文件,名字随意,内容随意,这里如下,文件名字为word.c
运行文件
首先查看这里并没有2.txt文件,把2.txt文件作为传参,运行成功就创建了该文件
查看该文件就发现与word.c文件内容一模一样
代码如下
#include<stdio.h>
#include<stdlib.h>
#define BUFFER_SIZE 1024
int main(int argc, char **argv)
{
FILE *source_file_fp , *target_file_fp;
char buffer[BUFFER_SIZE];
size_t bytes_read , bytes_written;
/*判断传入参数*/
if(argc != 3)
{
fprintf(stderr, "Usage: %s source_file_fp target_file_fp\n", argv[0]);
exit(EXIT_FAILURE);
}
/*打开文件*/
if((source_file_fp = fopen(argv[1],"r")) == NULL)
{
fprintf(stderr, "Error: cannot open source file '%s'\n", argv[1]);
exit(EXIT_FAILURE);
}
if((target_file_fp = fopen(argv[2],"a")) == NULL)
{
fprintf(stderr, "Error: cannot open target file '%s'\n", argv[2]);
exit(EXIT_FAILURE);
}
while((bytes_read = fread(buffer,1,BUFFER_SIZE,source_file_fp)) > 0)/*获取读取量*/
{
bytes_written = fwrite(buffer,1,bytes_read,target_file_fp);/*获取写入量*/
if(bytes_written < bytes_read)
{
fprintf(stderr, "Error: cannot write to target file '%s'\n", argv[2]);
exit(EXIT_FAILURE);
}
}
fclose(source_file_fp);
fclose(target_file_fp);
printf("File '%s' has been successfully copied to '%s'\n", argv[1], argv[2]);
return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/3065.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!