首页 > 其他分享 >系统io的使用

系统io的使用

时间:2024-08-01 21:24:06浏览次数:9  
标签:文件 int open 系统 fd io 使用 include buf

1、打开文件与关闭文件:

int main(void)
{
    int fd;        //定义的文件描述符
    fd=open("1.txt",O_RDWR|O_CREAT|O_EXCL, 0644);  //打开文件1.txt如果不存在则创建并可读可写
    if(fd==-1)        //fd返回-1则表示打开文件失败
    {
        // 以下两条语句效果完全一致:输出函数出错的原因
        perror("open failed");    // 全局错误码声明所在的头文件#include <errno.h>
        //使用perror(),直接输出用户信息和错误信息

        printf("open failed:%s\n",strerror(errno));
        //使用strerror(),返回错误信息交给用户自行处理

        return 0;
    }
    close(fd);        //关闭文件
    return 0;
}

       一般而言,perror()用起来更加方便,但有时候需要使用strerror()来输出一些更加灵活的信息  ;

     注:perror函数会自己在结尾添加(:)冒号与('\n')换行   。

2、文件描述符:

  • 文件描述符的概念:
    •  函数 open() 的返回值,是一个整型 int 数据。
      • 这个整型数据,实际上是打开文件时,内核产生一个指向 file{} 的指针,并将该指针放入一个位于 file_struct{} 结构体中的数组 fd_array[ ] 中,而该指针所在数组的下标,就被 open() 返回给用户,用户把这个数组下标称为文件描述符。

  • 文件描述符从0开始,每打开一个文件,就产生一个新的文件描述符。

        打开文件最多打开1024个,如果计数就是1021个,因为从3开始计数,0,1,2被标准输入、标准输出和标准出错三个文件占用;

  • 可以重复打开同一个文件,每次打开文件都会使内核产生系列结构体,并得到不同的文件描述符
  • 由于系统在每个进程开始运行时,都默认打开了一次键盘、两次屏幕,因此0、1、2描述符分别代表标准输入、标准输出和标准出错三个文件(两个硬件)。
  • 在Linux-C中

    标准输入对应的名称是 stdin 键盘

    标准输出对应的名称是 stdout 屏幕终端

    标准出错对应的名称是 stderr 屏幕终端

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
    int fd;
    fd=open("1.txt",O_RDWR|O_CREAT|0644);
    if (fd==-1)
    {
        perror("open failed");
    }
    printf("%d\n",fd);
    close(fd);
    return 0;
}

输出:

3、文件的读写操作:

 

  • 读取普通文件时,如果当读到了文件尾,read()会返回0。

读取文件:

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

int main(int argc,char *argv[])
{
    int fd;
    char buf[100];            //定义一个数组作为数据缓冲区
    fd=open("1.txt",O_RDWR|O_APPEND);
    if (fd==-1)
    {
        perror("open failed");
    }
    bzero(buf,sizeof buf);
    int rt=read(fd,buf,sizeof buf);    //从fd文件描述符中读取100个字节的数据存入buf中
    if (rt==-1)
    {
        perror("read failed");
    }
    printf("文件内容为:%s\n",buf);
    close(fd);
    return 0;
}

输出:

写入数据:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
    int fd;
    char buf[128];
    char buff[100];
    fd=open("1.txt",O_RDWR|O_APPEND);
    if (fd==-1)
    {
        perror("open failed");
    }
    bzero(buff,sizeof buff);
    bzero(buf,sizeof buf);
    fgets(buff,sizeof buff,stdin);    //从键盘上写入数据并存入buff中
    write(fd,buff,strlen(buff));      //将buff的内容写入fd文件描述符中
    lseek(fd,0,SEEK_SET);             //将文件光标移动到开头
    int rt=read(fd,buf,sizeof buf);
    if (rt==-1)
    {
        perror("read failed");
    }
    printf("文件内容为:%s\n",buf);
    close(fd);
    return 0;
}

输出:

4、写入位置的设置(光标):

        对文件进行常规的读写操作的时候,系统会自动调整读写位置,以便于让我们顺利地顺序读写文件,但如果有需要,文件的读写位置是可以任意调整的,调整函数接口如下:

  • lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”。
  • lseek函数只能对普通文件调整文件位置,不能对管道文件调整。
  • lseek函数的返回值是调整后的文件位置距离文件开头的偏移量,单位是字节。

 

 

标签:文件,int,open,系统,fd,io,使用,include,buf
From: https://blog.csdn.net/biubiuboomy/article/details/140855698

相关文章

  • 使用Canal监听Binlog将数据发送到RocketMQ
    文章目录一、部署RocketMQ二、部署MySQL1、开启mysql的binlog写入功能2、创建一个有相关权限的mysqlslave账号三、部署Canal1、修改conf/canal.properties配置文件2、修改conf/example/instance.properties配置文件四、实际操作一、部署RocketMQwin11部署Rocke......
  • ollama 简易使用教程
    ollama安装Install使用以下命令安装ollama:curl-fsSLhttps://ollama.com/install.sh|sh手动安装下载ollama二进制文件:sudocurl-Lhttps://ollama.com/download/ollama-linux-amd64-o/usr/bin/ollamasudochmod+x/usr/bin/ollama添加ollama作为启动服务(推......
  • 使用snapshot_download配置代理多线程下载模型
    snapshot_downloadhuggingface官方提供了snapshot_download方法下载完整模型,参数众多、比较完善。支持断点续传、多线程、指定路径、配置代理、排除特定文件等功能。然而有两个缺点:1))该方法依赖于transformers库,而这个库是个开发用的库,对于自动化运维有点重;2)该方法调用......
  • Jenkins 配置即代码(Configuration as Code)详解
    1、概述在《Centos7下安装配置最新版本Jenkins(2.452.3)》这篇博文中讲解了如何安装Jenkins,虽然在安装Jenkins时安装了一些必备的推荐插件,但在企业环境中使用Jenkins之前,我们仍需完成一系列手动配置工作,如配置SystemConfiguration、Security。SystemConfiguration是确保......
  • 文件系统类型详解及选择指南
    文件系统类型详解及选择指南大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!文件系统是操作系统管理存储设备的一种方式,负责文件的存储、读取和管理。不同的文件系统有不同的特性和适用场景。了解这些文件系统类型有助于我们根据需求选择最合适的文件系统......
  • Calendar类在Java中的使用与技巧
    Calendar类在Java中的使用与技巧大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Calendar类是Java中处理日期和时间的重要工具。虽然Java8引入了更现代的java.time包,但Calendar类依然在许多现有项目中广泛使用。本文将介绍Calendar类的基本用法、常见技......
  • 如何优化淘客返利系统中的前端性能与用户体验
    如何优化淘客返利系统中的前端性能与用户体验大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论如何优化淘客返利系统中的前端性能与用户体验。良好的前端性能和用户体验不仅能够提升用户满意度,还能增加系统的使用率和转换率。一、前端......
  • 在淘客返利系统中使用Kafka实现事件驱动架构
    在淘客返利系统中使用Kafka实现事件驱动架构大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何在淘客返利系统中使用Kafka实现事件驱动架构,以提高系统的可扩展性和灵活性。一、什么是事件驱动架构事件驱动架构(Event-DrivenArchit......
  • SpringBoot+Vue物流快递仓库管理系统-附源码与配套论文
    1.1研究背景 随着网络不断的普及发展,物流快递仓库管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、驾驶员管理、仓库管理、配送管理、运输管理管理等功能,利用目前网络给......
  • @Param的使用
    对于@param的使用:单个参数:对于基本数据类型包括string加不加都可以对于对象,加的话List<User>getUser(@Param("user")Useruser);用以#{user.username}不加则getUser(Useruser);=#{username}多个参数对于基本数据类型,低版本mybatis要加参数包含对象,加不......