读取 time.txt 文件,写入到time_2.txt
一、函数
1.1、open() 函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
第二个open是第一个open和creat的结合版:
函数功能:打开文件
函数参数1:被打开文件的路径
函数参数2:以什么样的形式打开文件
必须包含如下的其中一个
O_RDONLY : 以只读的形式打开该文件
O_WRONLY : 以只写的形式打开该文件
O_RDWR : 以读写的形式打开该文件
------------------------------------------------------------------------------------------------------------
如果需要别的权限,要使用 | 形式拼装 a O_WRONLY | O_CREAT | O_APPEND
O_EXCL:如果文件已经存在,则打开操作失败。通常与 O_CREAT 一起使用,用于确保创建新文件而不覆盖已存在的文件。
O_CREAT:如果文件不存在,则创建文件。如果文件已存在,它不会被截断,而只是打开。
O_TRUNC:如果文件已经存在,将文件长度清为0。这将删除文件的现有内容。
O_APPEND:将文件指针设置到文件末尾,以便所有写入操作都追加到文件末尾,而不是覆盖现有内容。
O_NONBLOCK:以非阻塞模式打开文件。在非阻塞模式下,读取和写入操作将不会被阻塞,即使没有可用的数据或空间。
O_NDELAY同O_NONBLOCK
O_SYNC:要求所有I/O操作是同步的,即写入操作完成后,才返回。这可以确保数据写入到磁盘而不是缓存在内存中。
O_DIRECTORY:要求打开的是一个目录而不是文件。用于确保只能打开目录。
O_NOFOLLOW:如果 pathname 是一个符号链接,则打开操作失败。用于防止解引用符号链接。
O_DIRECT:要求绕过内核缓存,直接在应用程序和存储设备之间进行数据传输。通常用于低级I/O操作和性能优化。
O_TMPFILE:创建一个临时文件,该文件在关闭后会自动删除。适用于需要临时文件的场景。
O_NOCTTY如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机
函数参数3:创建文件的权限 权限用二进制表示
函数返回值:成功返回文件描述符,失败返回-1(有可能会设置errno)
1.2、close() 函数
#include <unistd.h>
int close(int fd);
参数:
fd:文件描述符,需要关闭的文件。
返回值:返回 0 表示成功关闭文件,返回 -1 表示失败,并设置 errno 来指示错误原因。
常见用法:用于关闭一个已经打开的文件。
1.3、read() 函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
fd:文件描述符。
buf:用于存放读取数据的缓冲区。
count:要读取的字节数。
返回值:返回实际读取的字节数,如果到达文件末尾返回 0,出错返回 -1,并设置 errno 来指示错误原因。
常见用法:用于从文件中读取数据。
1.4、write() 函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:文件描述符。
buf:要写入的数据。
count:要写入的字节数。
返回值:返回实际写入的字节数,出错返回 -1,并设置 errno 来指示错误原因。
常见用法:用于向文件中写入数据。
二、源码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
/**
* 主函数:实现从源文件到目标文件的内容复制
* @param argc 命令行参数的数量
* @param argv 命令行参数的字符串数组
* @return 程序退出状态
*/
int main(int argc, const char *argv[])
{
int fr = 0, fw = 0, ret = 0;
char buf[100] = {0};
/* 检查命令行参数数量是否足够 */
if(argc < 3){
printf("usage: %s <src> <dst>\n", argv[0]);
return -1;
}
/* 打开源文件,只读模式 */
fr = open(argv[1], O_RDONLY);
/* 打开目标文件,写入模式,如果不存在则创建,存在则清空内容 */
fw = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
/* 检查源文件打开是否成功 */
if(-1 == fr){
perror("open fr");
return -1;
}
/* 检查目标文件打开是否成功 */
if( -1 == fw){
perror("open fw");
return -1;
}
/* 循环读取源文件内容,并写入目标文件,直到读取结束 */
while(1){
memset(buf, 0 ,sizeof(buf));
ret = read(fr, buf, sizeof(buf));
/* 检查读取操作是否成功 */
if(-1 == ret){
perror("read");
return -1;
}else if(0 == ret)
{
/* 读取结束,退出循环 */
printf("read end\n");
break;
}
/* 写入目标文件 */
write(fw, buf, 100);
}
/* 关闭源文件 */
close(fr);
/* 关闭目标文件 */
close(fw);
return 0;
}
三、结果展示
四、源码下载
链接:https://pan.baidu.com/s/1zGmHaum63E3pXIzLgOdUIg
提取码:njqp