简单聊聊系统IO基本的API

什么是系统IO:对文件的操作,基本上是输入输出因此一般称为IO接口。在操作系统的层面上,这一组专门针 对文件的IO接口就被称为系统IO 。

系统IO的特点:

  • 由操作系统直接提供的函数接口,特点是简洁,功能单一。

  • 没有提供缓冲区,因此对海量数据的操作效率较低。

  • 套接字Socket、设备文件的访问只能使用系统IO。

API是什么:应用程序接口(函数)。

系统IO主要有这几个函数(open,close,read,write,lseek)。

  1. open函数原型

  • int open(const char *pathname,int flags);

  • int open(const char *pathname,int flags,mode_t mode);

pathname:表示要打开的文件

flags:表示以下几点

  1. O_RDONLY:只读打开文件。

  1. O_WRONLY:只写打开文件。

  1. O_RDWR:读写打开文件。

  1. O_CREAT:如果文件不存在,则创建该文件。

  1. O_TRUNC:文件已存在,则删除文件原有数据。//暂时就说这些

mode:如果文件被创建,则指定权限。

返回值:成功0,失败-1。

  1. close原型:

int close(int fd);

返回值:成功0,失败-1。

代码实现需包含指定头文件:#include <fcntl.h> #include <unistd.h>

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>     //open 

#include <unistd.h>     //close

int main()
{
    //第一种打开方式
    int fd = open("./file.txt",O_RDWR);    //读写打开文件。
    if(-1 == fd)
    {
        printf("打开文件失败\n");
        return -1;
    }

    printf("fd = %d\n",fd); //fd = 3 思考一下,为什么是3 
    //0标准输入,1标准输出,2标准出错

    //第二种打开方式
    int newfd = open("./file1.txt",O_RDWR | O_CREAT,0744);  //读写打开文件,不存在就创建
    if(-1 == newfd)
    {
        printf("打开文件失败\n");
        return -1;
    }
    close(fd);
    close(newfd);
    
}
  1. read原型:

ssize_t read(int fd,void *buf,size_t count);

fd:从文件读数据。

buf:指向存放读到数据的缓冲区。

count:想要读到的字节数

返回值:成功返回读到的字节数,失败-1。

  1. write原型:

ssize_t write(int fd,void *buf,size_t count);

fd:数据写入文件fd。

buf:指向要写入的数据。

count:要写入的字节数

返回值:成功返回实际写入的字节数,失败-1。

读操作示例代码:

#include <stdio.h>
#include <unistd.h> //read
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //open

int main()
{
    //假设已经打开了文件
    //执行读操作,循环读
    while(1)
    {
        ret = read(fd,read_buffer,6);
        if(0 == ret)
        {
            close(fd);
            return -1;
        }
        printf("%s\n",read_buffer); //输出每次读取的内容
        
        memset(read_buffer,0,sizeof(read_buffer));
    
    }
    close(fd);
    return 0;
}

写操作示例代码

#include <stdio.h>
#include <unistd.h> //read
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //open

int main()
{
    int ret;
    char write_buffer[32] = {0};
    //假设已经打开文件
    //执行写操作,循环写
    while(1)
    {
        printf("请输入要写入数据:");
        scanf("%s",write_buffer);
        ret = write(newfd,write_buffer,strlen(write_buffer));
        if(-1 == ret)
        {
            close(fd);
            return -1;
        }
        printf("ret = %d\n",ret);

        //在每次输入新的内容之前,将数组的内容清空
        memset(write_buffer,0,sizeof(write_buffer));

    }
    close(fd);
    return 0;

}
  1. lseek原型:

off_t lseek(int fd,off_t offset,int whence);

fd:要操作的文件描述符

offset:偏移量,可正可负

whence:校准点

SEEK_SET:文件开头

SEEK_CUR:当前位置

SEEK_END:文件末尾

返回值:新文件位置偏移量,失败-1。

关键点:

  1. lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地 方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”。

  1. lseek函数只能对普通文件调整文件位置,不能对管道文件调整。

  1. lseek函数的返回值是调整后的文件位置距离文件开头的偏移量,单位是字节。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值