Linux下文件I/O操作

读取 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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值