linux高级编程(文件I/O)

标准I/O与文件I/O的区别:

文件操作:
         缓存           操作对象                具体操作
标准IO  全缓存/行缓存   文件指针(流指针)FILE *  1.打开 --fopen  
                                                2.读写 
                                                  fgetc/fputc 
                                                  fgets/fputs 
                                                  fread/fwrite 
                                                3.关闭 
                                                  fclose 
                                                4.定位 
                                                  fseek/ftell/rewind 
                                                                                          
                                                  
文件IO  不带缓存        文件描述符 (整数)       1.打开 --open 
                                                2.读写 --read/write
                                                3.关闭 --close 
                                                4.定位 --lseek 

特性:

        .1 没有缓存区 (//可以认为数据直接交给了内核 )
        .2 操作对象不在是流(FILE *),而是文件描述符(整数)
        .3文件描述符
          很小的非负的整数    int   0-1023
          内核每打开一个文件就会获得一个文件    描述符   

         每个程序在启动的时候操作系统默认为其打开
            三个描述符与流对象匹配:
               0 ==>STDIN_FILENO === stdin
               1 ==>STDOUT_FILENO == stdout
               2 ==>STDERR_FILENO == stderr
      
          stdin,stdout,stderr,===>FILE*

优缺点:

标准I/O:

优点:

  1. 缓冲:标准I/O使用了缓冲区,可以减少对文件的直接访问,提高性能。
  2. 格式化输出:标准I/O函数如printfscanf提供了强大的格式化功能,可以方便地处理格式化输入输出。
  3. 跨平台:标准I/O函数在大多数操作系统上都是可用的,提高了代码的可移植性。

缺点:

  1. 性能:与文件I/O相比,标准I/O可能会有额外的性能开销,因为它包含了额外的缓冲和格式化处理。
  2. 复杂性:标准I/O函数可能比文件I/O函数更复杂,需要更多的参数和错误处理。

文件I/O:

优点:

  1. 性能:文件I/O直接操作文件描述符,没有额外的缓冲和格式化处理,因此通常比标准I/O更快。
  2. 灵活性:文件I/O提供了更多的控制和灵活性,允许程序员直接操作文件和文件描述符。
  3. 无缓冲:文件I/O可以直接读写文件,无需缓冲区,这使得它可以用于处理非常大的文件或需要实时处理的数据。

缺点:

  1. 复杂性:文件I/O函数通常比标准I/O函数更复杂,需要更多的参数和错误处理。
  2. 格式化:文件I/O不提供格式化功能,需要程序员手动处理数据格式。
  3. 跨平台:文件I/O函数在不同的操作系统上可能有不同的行为,这降低了代码的可移植性。

一般在没有特殊要求的情况下,在linux下优先选择文件I/O

open()

1.open
        open("1.c",O_WRONLY|O_CREAT,0666 );
        
        int open(const char *pathname, int flags,int mode);
        功能:
            获得一个文件描述符
        参数:
            pathname:文件名
            flags:
            必须项:他们之间是互斥的,所以有且只能有一个 
                O_RDONLY
                O_WRONLY
                O_RDWR
            可选项:
            O_CREAT, 创建文件  //这个标志量存在,则需要指定参数 mode
            O_EXCL,  需要和O_CREAT同时使用,表示新建的文件不存在,成功,否则open就会失败
            O_TRUNC  文件内容清空
            O_APPEND追加
            
            //后面
            O_NOCTTY,不是终端设备
            O_ASYNC 异步io,什么时候io不确定,
            O_NONBLOCK 非阻塞 

一般在创建文件时,都加入截断操作,标准io中w=O_CREAT | O_WRONLY | O_TRUNC

write()

    2.write
        char buf[1024];
        ssize_t write(int fd,  const  void *buf, size_t count);
        功能:
            通过文件描述符向文件中写一串数据
        参数:
            fd:文件描述符
            buf:要写入文件的字符串的首地址
            count:要写入字符的个数
        返回值: 
            成功返回实际写入的个数
            失败返回-1

read()

3.read
        ssize_t read(int fd, void *buf, size_t count);
        功能:
            通过文件描述符读取文件中的数据
        参数:
            fd:文件描述符
            buf:存放数据空间的首地址
            count:要读到数据的个数
        返回值:
            成功返回读到数据的个数
            失败返回-1
            读到文件结尾返回0

lssek()

4.lseek  ==  fseek, rewind ftell
        off_t lseek(int fd, off_t offset, int whence);
        功能:
            定位文件的位置
        参数:
            fd:文件描述符
            offset:偏移量
                        正:向后偏移
                        负:向前偏移
                        零:不偏移
            whence:
                SEEK_SET
                SEEK_CUR
                SEEK_END
                         正 空洞 
        返回值:
            成功返回偏移量
            失败返回-1
            lseek(fd,0,SEEK_END);

文件描述符与流指针的转换:

filino:

int fileno(FILE *stream);
功能:
    获得一个文件流指针中的文件描述符
参数:
    stream:文件流指针
返回值:
    成功返回文件描述符
    失败返回-1

fdopen:

2.fdopen    int fd -> FILE *fp
 FILE *fdopen(int fd, const char *mode);
 功能:
    将文件描述符转化为文件流指针
 参数:
    fd:已经打开的文件描述符
    mode:
        "r"
        "r+"
        "w"
        "w+"
        "a"
        "a+"
 返回值:
    成功返回文件流指针
    失败返回NULL    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows右键没有新建Word、PPT与Excel的解决方法

本文介绍在Windows电脑中,右键与资源管理器的“新建”选项中,都没有新建Word、PPT或Excel文件的解决方法。 最近,发现一台重装了系统与Office的电脑中,无论是桌面上与资源管理器中的右键,还是资源管理器左侧顶部的“新…

力扣1546.和为目标值且不重叠的非空子数组的最大数目

力扣1546.和为目标值且不重叠的非空子数组的最大数目 从头开始找 找到满足条件的就清空哈希表 class Solution {public:int maxNonOverlapping(vector<int>& nums, int target) {int n nums.size();vector<int> s(n1);for(int i0;i<n;i) s[i1] s[i] n…

手写简单模拟mvc

目录结构&#xff1a; 两个注解类&#xff1a; Controller&#xff1a; package com.heaboy.annotation;import java.lang.annotation.*;/*** 注解没有功能只是简单标记* .RUNTIME 运行时还能看到* .CLASS 类里面还有&#xff0c;构建对象久没来了&#xff0c;这个说明…

掌握Vue 3生命周期:从组合式API到高效代码实践

引言 在 Vue 3 中&#xff0c;生命周期的概念得到了进一步的优化和简化。Vue 3 引入了组合式 API&#xff08;Composition API&#xff09;&#xff0c;这为开发者提供了更灵活的方式来组织和重用代码逻辑。与传统的选项式 API&#xff08;Options API&#xff09;相比&#x…

node-sass 老版本4.14.0 安装失败解决办法

旧项目 npm install 发现 node-sass 安装 失败 切换淘宝镜像之后 不能完全解决问题。因为需要编译&#xff0c;本地没有Python环境不能实现 安装node-sass时&#xff0c;在install阶段会从Github上下载一个叫binding.node的文件&#xff0c;而「GitHub Releases」里的文件…

C++编译链接原理

从底层剖析程序从编译到运行的整个过程 三个阶段 一、编译阶段二、链接阶段三、运行阶段 为了方便解释&#xff0c;给出两端示例代码&#xff0c;下面围绕代码进行实验&#xff1a; //sum.cpp int gdata 10; int sum(int a,int b) {return ab; }//main.cpp extern int gdata…

Stream流的简单用法

filter //stream流中的filter //filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤掉空字符串&#xff1a; List<String> filter Arrays.asList("mz", "", "mz55", "m", "MZ"); Stream&l…

初始redis:在Ubuntu上安装redis

1.先切换到root用户 使用su命令切换到root 2.使用apt命令来搜索redis相关的软件包 命令&#xff1a;apt search redis 3.下载redis 命令&#xff1a; apt install redis 在Ubuntu 20.04中 &#xff0c;下载的redis版本是redis5 4.查看redis状态 命令&#xff1a; netst…

Python自动化测试系列[v1.0.0][高效自动化设计]

Python多线程应用于自动化测试 将多线程在测试巧妙地应用&#xff0c;确实会带来很多好处&#xff0c;并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

LLM 入门与实践(四) Yi 部署与分析

本文截取自20万字的《PyTorch实用教程》&#xff08;第二版&#xff09;&#xff0c;敬请关注&#xff1a;《Pytorch实用教程》&#xff08;第二版&#xff09;无论是零基础入门&#xff0c;还是CV、NLP、LLM项目应用&#xff0c;或是进阶工程化部署落地&#xff0c;在这里都有…

python对象

类 我们目前所学习的对象都是Python内置的对象但是内置对象并不能满足所有的需求&#xff0c;所以我们在开发中经常需要自定义一些对象类&#xff0c;简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象类就是对象的图纸&#xff01;我们也称对象是类的实例&#…

JAVA--IO流

一、IO流什么&#xff1f; I/O是Input/output的缩写&#xff0c;用于处理设备之间的数据传输。如读/写文件、网络通讯。 java程序中&#xff0c;对于数据的输入、输出是以流&#xff08;Stream)的方式进行。 Java.io包下提供了各种流类和接口&#xff0c;用以获取不同种类的数…

web自动化(六)unittest 测试报告跳过用例

三种类型测试报告&#xff1a;unittest.TextTestRunner、BeautifulReport、HTMLTestRunner Python3.0 无法直接安装 HTMLTestRunner 安装 XTestRunner pip install XTestRunner安装 BeautifulReport pip install BeautifulReportimport unittestclass TestSkipCase(unittest…

ELfK logstash filter模块常用的插件 和ELFK部署

ELK之filter模块常用插件 logstash filter模块常用的插件&#xff1a; filter&#xff1a;表示数据处理层&#xff0c;包括对数据进行格式化处理、数据类型转换、数据过滤等&#xff0c;支持正则表达式 grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名…

【算法篇】KMP算法,一种高效的字符串匹配算法

我们今天了解一个字符串匹配算法-KMP算法&#xff0c;内容难度相对来说较高&#xff0c;建议先收藏再细品&#xff01;&#xff01;&#xff01; KMP算法的基本概念 KMP算法是一种高效的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#…

LLMs之gptpdf:gptpdf的简介、安装和使用方法、案例应用之详细攻略

LLMs之gptpdf&#xff1a;gptpdf的简介、安装和使用方法、案例应用之详细攻略 目录 gptpdf的简介 1、处理流程 第一步&#xff0c;使用 PyMuPDF 库&#xff0c;对 PDF 进行解析出所有非文本区域&#xff0c;并做好标记&#xff0c;比如: 第二步&#xff0c;使用视觉大模型&…

离婚后,孩子就读私立高中的高昂学费谁承担?

江苏省南京市六合区人民法院审结一起抚养费纠纷案件&#xff0c;认定夫妻双方在决定孩子教育事务上均存在责任&#xff0c;为保障临近高考的未成年子女的切身利益&#xff0c;认定由夫妻双方按比例承担教育费。   2015年6月&#xff0c;李某与王某离婚&#xff0c;双方之子小…

PCL 有序点云的法线估计(使用积分图进行法线估计)

使用积分图进行法线估计 一、概述1.1 概念1.2 有序点云与无序点云1.2.1 有序点云1.2.2 无序点云1.3 代码讲解二、代码实现三、结果示例一、概述 1.1 概念 使用积分图进行法线估计:计算一个有序点云的法线,注意该方法只适用于有序点云。 1.2 有序点云与无序点云 有序点云与无…

MySQL安装时initializing database失败

问题页面&#xff1a; 解决方法&#xff1a; 1.勾选红框中的选项&#xff1a; 2.将下图红框中全部改为英文&#xff1a; 然后一路next就可以了。

cs231n作业1——KNN

参考文章&#xff1a;assignment1——KNN KNN 测试时分别计算测试样本和训练集中的每个样本的距离&#xff0c;然后选取距离最近的k个样本的标签信息来进行分类。 方法1&#xff1a;Two Loops for i in range(num_test):for j in range(num_train):dist X[i, :] - self.X…