文件IO操作

14 篇文章 0 订阅
12 篇文章 0 订阅

一、概念

在系统(posix)中定义的一组用于输入输出的函数

二、特点

1) 没有缓冲机制,每次调用都会引起系统调用

2) 围绕文件描述符进行操作,非负整数 (>=0),依次分配

3) 文件IO默认打开了三个文件描述符,分别是 0(标准输入),1(标准输出),2(标准错误)

4)操作任意类型的文件b c - l s p   不能操作d

三、函数

不同进程打开相同文件,文件指针各不相同

    1. 打开文件 open

int open(const char *pathname, int flags);
功能:打开文件
参数:pathname:文件路径名
      flags:打开文件的方式
            O_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:可读可写
            O_CREAT:创建
            O_TRUNC:清空
            O_APPEND:追加   
返回值:成功:文件描述符
        失败:-1
当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限 
int open(const char *pathname, int flags, mode_t mode);
创建出来的文件权限为指定权限值&(~umask)  //umask为文件权限掩码

系统自动降低文件权限:mode&(~umask) (不同系统:umask大小不同)

    1. 关闭文件 close

int close(int fd);
功能:关闭文件
参数:fd:文件描述符

    1. 读写操作 read write

ssize_t read(int fd, void *buf, size_t count);
功能:从一个已打开的可读文件中读取数据
参数:fd  文件描述符
          buf  存放位置
         count  期望的个数
返回值:成功:实际读到的个数
              返回-1:表示出错,并设置errno号
              返回0:表示读到文件结尾	
ssize_t write(int fd, const void *buf, size_t count);
功能:向指定文件描述符中,写入 count个字节的数据。
参数:fd   文件描述符
          buf   要写的内容
          count  期望值
返回值:成功:实际写入数据的个数
              失败  : -1

    1. 定位操作 lseek
off_t lseek(int fd, off_t offset, int whence);
功能:设定文件的偏移位置	
参数:fd:文件描述符
	offset偏移量  				
		正数:向文件结尾位置移动
		负数:向文件开始位置
	whence  相对位置
		SEEK_SET   开始位置
		SEEK_CUR   当前位置
		SEEK_END   结尾位置
返回值:成功:文件的当前位置
	      失败:-1
/*
O_RDONLY :只读
O_WRONLY:只写
O_RDWR:可读可写

O_CREAT:创建
O_TRUNC:清空
O_APPEND:追加

r:只读.O_RDONLY
r+:可读可写,文件不存在报错。O_RDWR
w:只写,文件不存在创建,存在清空,O_WRONLY|O_CREAT|O_TRUNC
w+:可读可写,文件不存在创建,存在清空 O_RDWR|O_CREAT|O_TRUNC
a:文件不存在创建,存在追加 O_WRONLY|O_CREAT|O_APPEND
a+:可读可追加,文件不存在创建,存在追加 0_RDWR|O_CREAT|O_APPEND
 */
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc, char const *argv[])
{
    //打开文件
    //当第二个参数中有O_CREAT选项时,需要第三个参数
    // int fd = open("a.txt",O_RDONLY);
    // if(fd<0)
    // {
    //     perror("open err");
    //     return -1;
    // }
    // printf("fd:%d\n",fd);
    int fd = open("b.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
    if(fd<0)
    {
        perror("open err");
        return -1;
    }
    printf("fd:%d\n",fd);
    //读写操作
    write(fd,"hello\n",6);
    char buf[32]={0};
    //将文件指针移动到开头
    lseek(fd,0,SEEK_SET);
    ssize_t s =read(fd,buf,32);
    printf("%d %s\n",s,buf);
    //lseek返回值是当前位置前字符个数
    off_t len = lseek(fd,0,SEEK_END);
    printf("%ld\n",len);
    //关闭文件
    close(fd);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满山的猴子我的腚最红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值