标准IO和文件IO

news2024/11/25 12:30:37

标准IO

        接上节

函数接口

(1)fseek函数

1.功能:将文件流中的文件指针从指定的起始位置开始偏移指定的字节数。

2.参数:(目标文件,偏移量,参考点)

  • stream:要移动文件指针的目标文件流对象,注意不支持设备文件,一般用于普通文件。
  • offset:要在文件内偏移的距离,单位为字节。如果值为正数,则向文件末尾偏移;如果值为负数,则向文件开头偏移。
  • whence:偏移的起始位置,由系统定义的三个宏确定,分别是SEEK_SET(文件的开头位置)、SEEK_CUR(文件的当前位置)、SEEK_END(文件的末尾位置)。

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

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    FILE* fp = fopen("1.txt","w+");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    char buf[128]="hello world";
    fputs(buf,fp);
    fseek(fp,0,SEEK_SET);

    bzero(buf,sizeof(buf));
    fgets(buf,sizeof(buf),fp);
    printf("buf is %s\n",buf);

    fclose(fp);
    return 0;
}
(2)ftell函数

1.功能:获取当前文件流指针的具体位置,一般以文件开头到当前指针的字节数为返回值。

2.参数stream为要返回指针距离的文件流对象。

3.返回值:成功获取到的距离长度,单位是字节;失败返回 - 1。

(3)rewind函数

1.功能:将文件指针重新定位到文件的开头,等效于fseek(stream, 0L, SEEK_SET)

2.参数stream为要进行操作的文件流对象。

#include <stdio.h>

int main(int argc, char *argv[])
{
    
    FILE* fp = fopen("1.txt","r");
    if(NULL == fp)
    {
        printf("fopen error");
        return 1;
    }
    char buf[1024]={0};
    fgets(buf,sizeof(buf),fp);
    printf("1 buf is %s\n",buf);
    rewind(fp);
    fgets(buf,sizeof(buf),fp);
    printf("2 buf is %s\n",buf);

    fclose(fp);

    return 0;
}
(4)feof函数:

        标准输入输出库中的一个函数,用于判断文件流指针是否到达文件结尾。

  1. 1.功能:判断当前参数stream的文件流指针是否到达文件结尾。如果到达文件结尾则返回真,否则返回假。注意,该操作一定要在一次IO操作之后判断。
  2. 2.参数stream为要判断结尾的文件流对象,可以是stdin(程序会阻塞等待),如果是普通文件fp则指向文件第一行数据。
  3. 3.返回值:成功到达结尾返回真,否则返回假。

在使用feof函数时,通常与其他文件操作函数结合使用,例如fgetcfread等,用于判断文件是否读取完毕。

缓存区

1.行缓存(Line Buffering)

        行缓存是一种缓存机制,主要用于人机交互,如终端(stdout)。

        特点

       (1) 缓存区大小通常为1K。

        (2)刷新条件包括遇到\n刷新、缓存区满刷新、程序结束刷新以及使用fflush刷新(fflush(stdout))。

        (3)行缓存多是关于终端的一些操作,例如在输入输出中,当遇到换行符\n时,会刷新缓存区,将数据输出或读取。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    // 1 printf("hello\n");
    /* 2
    int i = 0 ;
    for(i = 0 ;i<1025;i++)
    {
        //printf("a");
        fputc('a',stdout);
    }
    while(1)
        sleep(1);
        */

    //3 
    // printf("hello");
    //
    printf("hello");
    fflush(stdout);
    while(1);
    return 0;
}

2.全缓存(Full Buffering)

        全缓存主要用于文件的读写操作。

        特点

        (1)缓存区大小通常为4K。

        (2)刷新条件包括缓存区满刷新、程序结束刷新以及使用fflush刷新(fflush(fp))。

        (3)对普通文件进行标准IO操作时,建立的缓存一般为全缓存。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    FILE* fp = fopen("1.txt","w");    
    /*char buf[]="hello";
    fputs(buf,fp);
*/
    /* 4K
    int i = 0 ;
    for(i = 0 ;i<4097;i++)
    {
        fputc('a',fp);
    }
    while(1)
        sleep(1);
        */ 


    char buf[]="hello";
    fputs(buf,fp);
    fflush(fp);

    while(1)
        sleep(1);
    return 0;
}

3.无缓存(No Buffering)

        不对数据进行缓存,直接刷新。

        特点

        (1)主要用于出错处理信息的输出,如stderr。

        (2)不缓存数据,直接将数据输出或处理。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    
    fprintf(stderr,"fopen error ");
    while(1)
        sleep(1);
    return 0;
}

        在标准IO中,不同的缓存机制适用于不同的场景,以提高数据处理的效率和性能。例如,行缓存适用于终端交互,能够及时响应用户的输入和输出;全缓存适用于文件读写,能够减少系统调用的次数,提高数据传输的效率;无缓存则适用于需要及时输出错误信息等情况。

文件io


        在操作系统中,为了方便用户使用系统功能,系统对外提供了一组系统函数,称为系统调用,其中包括文件IO。文件IO是一种基于Linux内核的没有缓存的IO机制,主要用于对设备文件和普通文件进行操作。

一、文件IO的特性

  1. 无缓存区:文件IO操作直接对文件进行读写,不依赖于缓存区,这意味着数据的读写更加直接和高效,但也需要用户自己管理数据的缓存。
  2. 文件描述符:文件IO的操作对象是文件描述符,这是一个小的非负整数(通常在0 - 1023之间)。内核为每一个打开的文件分配一个文件描述符,程序可以通过文件描述符来对文件进行操作。
  3. 默认打开的描述符:在程序启动时,操作系统会默认为其打开三个与流对象匹配的描述符:
  • 0 ==> STDIN_FILENO === stdin(标准输入)
  • 1 ==> STDOUT_FILENO == stdout(标准输出)
  • 2 ==> STDERR_FILENO == stderr(标准错误输出)

二、函数接口

(1)open函数

1.功能:获得一个文件描述符。

 2.参数:

  • pathname:文件名。
  • flags:
O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式
O_CREAT创建文件
O_EXCL需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败
O_NOCTTY不是终端设备
O_TRUNC文件内容清空
O_APPEND追加
O_ASYNC异步IO,什么时候IO不确定
O_NONBLOCK非阻塞
  • 返回值:成功返回文件描述符,失败返回 - 1。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd= open("1.txt",O_WRONLY | O_CREAT|O_TRUNC,0666);//truncate
    if(-1 == fd)
    {
        printf("open error\n");
        return 1;
    }
    printf("fd is %d\n",fd);
    return 0;
}
(2)write函数

1.功能:通过文件描述符向文件中写一串数据。

2.参数:

  • fd:文件描述符。
  • buf:要写入文件的字符串的首地址。
  • count:要写入字符的个数。

3.返回值:成功返回实际写入的个数,失败返回 - 1。

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

int main(int argc, char *argv[])
{
    int fd= open("1.txt",O_WRONLY | O_CREAT|O_TRUNC,0666);//truncate
    if(-1 == fd)
    {
        printf("open error\n");
        return 1;
    }
    printf("fd is %d\n",fd);
    char buf[128]="hello,world";
    int wr_ret = write(fd,buf,strlen(buf));
    if(-1 == wr_ret)
    {
        printf("write error\n");
        return 1;
    }
    close(fd);
    return 0;
}
(3)read函数

1.功能:通过文件描述符读取文件中的数据。

2.参数:

  • fd:文件描述符。
  • buf:存放数据空间的首地址。
  • count:要读到数据的个数。

3.返回值:成功返回读到数据的个数,失败返回 - 1,读到文件结尾返回0。

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

int main(int argc, char *argv[])
{
    int fd= open("1.txt",O_RDONLY);//truncate
    if(-1 == fd)
    {
        printf("open error\n");
        return 1;
    }
    printf("fd is %d\n",fd);

    char buf[512]={0};
    int rd_ret = read(fd,buf,sizeof(buf));
    if(rd_ret<=0)
    {
        printf("read eof or error\n");
        return 1;
    }
    printf("ret %d,%s\n",rd_ret,buf);

    close(fd);
    return 0;
}
(4)close函数

1.功能:关闭一个已打开的文件描述符,释放相关资源。

2.参数:需要关闭的文件描述符。

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

(5)lseek函数

1.功能:定位文件光标的位置。

2.参数:

  • fd:文件描述符,表示要操作的文件。
  • offset:偏移量,可以是正数(向后偏移)、负数(向前偏移)或零(不偏移)。
  • whence:指定偏移的起始位置,有以下几种取值:
    • SEEK_SET:从文件开头开始计算偏移量。
    • SEEK_CUR:从当前文件光标位置开始计算偏移量。
    • SEEK_END:从文件末尾开始计算偏移量。

3.返回值:成功返回偏移量。失败返回 - 1。

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

int main(int argc, char *argv[])
{
    int fd= open("1.txt",O_WRONLY);//truncate
    if(-1 == fd)
    {
        printf("open error\n");
        return 1;
    }
    printf("fd is %d\n",fd);
    off_t offset = lseek(fd,6, SEEK_SET);
    printf("offset %ld\n",offset);
    write(fd,"china",5);
    close(fd);
    return 0;
}

文件IO与标准IO的比较

文件IO

  • 特点:基于Linux内核,没有缓存区,操作对象是文件描述符,直接对文件进行读写。
  • 适用场景:用于底层设备相关的开发。
  • 优势:在某些特定场景下,如对性能要求较高、需要直接操作设备文件等,具有优势。
  • 不足:效率、安全性和移植性相对较差。

标准IO

  • 特点:是对文件IO的封装,使用流(FILE*)进行操作,具有缓存机制(行缓存、全缓存、无缓存)。
  • 适用场景:适用于纯上层开发。
  • 优势:效率和安全性较高,移植性好,使用方便。
  • 不足:对于底层设备的直接操作能力相对较弱。

        总的来说,文件IO更接近底层,适合一些对性能和直接控制有较高要求的场景;标准IO则在大多数上层应用中更为常用,因为它提供了更方便、高效和安全的文件操作方式。在实际开发中,应根据具体需求选择合适的IO方式。

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

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

相关文章

一个网络上计算机的通信

一台计算机上多个进程间的通信方式有&#xff1a;管道、共享内存、信号量、消息队列。如果不同的计算机上多个进程间通信&#xff0c;即通信的进程在不同的计算机上&#xff0c;需要用到网络相关的知识。 那么两台计算机通信需要解决哪些问题&#xff1f; 我们来回顾一下计算机…

【电路笔记】-无源衰减器

无源衰减器 文章目录 无源衰减器1、概述2、简单衰减器3、无源衰减器示例14、无源衰减器设计5、切换式衰减器6、总结无源衰减器是一种特殊类型的电气或电子双向电路,由完全电阻元件组成。 1、概述 无源衰减器基本上是两个端口电阻网络,旨在将电源提供的功率削弱或“衰减”(因…

什么是企业组网?

企业组网是通过网络技术将企业内的各种设备、系统和资源连接起来&#xff0c;实现信息共享、通信协作、资源优化和业务流程高效管理的过程。其核心目标是建立一个稳定、灵活、安全且高效的网络基础架构&#xff0c;以支撑企业的运营和发展。本文将详细介绍搭建企业组网需要考虑…

Linux操作系统学习之文件系统

一. 前言 Linux一切皆文件的思想可谓众所周知&#xff0c;而其文件系统又是字符设备、块设备、管道、进程间通信、网络等等的必备知识&#xff0c;因此其重要性可想而知。本文将先介绍文件系统基础知识&#xff0c;然后介绍最重要的结构体inode以及构建于其上的一层层的文件系…

显示类控件

目录 1.Label 代码示例: 显示不同格式的文本 代码示例: 显示图片 代码示例: 文本对齐, 自动换行, 缩进, 边距 代码示例: 设置伙伴 2.LCD Number 代码示例: 倒计时 3.ProgressBar 代码示例: 设置进度条按时间增长 代码示例: 创建一个红色的进度条 4.Calendar Widget …

【C#】计算多边形的面积

一、问题分析 在 C# 中计算多边形面积的一种常见方法是使用顶点坐标。 假设您有一个由一系列 (x, y) 顶点坐标定义的多边形&#xff0c;您可以使用“鞋带公式”&#xff08;也称为高斯公式&#xff09;来计算其面积。 如果是计算多边形的面积可以分为正常多边形、dicom图像中…

工单触发器如何助力企业提升效率?天润融通案例解析

工单&#xff0c;用于记录、跟踪和管理特定工作任务或服务请求的工具。通过工单可以完成任务跨组织、跨部门流转和协同等问题&#xff0c;例如&#xff1a; 市场线索→创建工单→判定需求→分配到区域→分配到销售→销售跟进→成功交易客户投诉建议→创建工单→分配到区域→分…

C语言入门基础题:传递闭包

1.题目描述 给定一张点数为 n 的有向图的邻接矩阵&#xff0c;图中不包含自环&#xff0c;求该有向图的传递闭包。张图的邻接矩阵定义为一个n xn 的矩阵 A (aij)nx”&#xff0c;其中(1,i到j存在直接连边aii0,i到j没有直接连边张图的传递闭包定义为一个„ xn的矩阵 B (bij)nx”…

职场中,真正的大人物都具有这几个特点

职位是组织赋予的&#xff0c;是领导提拔的&#xff0c;有些人失去了身上的标签、职位&#xff0c;很快就是失去往日的荣光。 职场中真正的牛人&#xff0c;他们不一定有多高的职位&#xff0c;但他们在领导眼里有分量&#xff0c;又能得到同事的尊重。 这类人身上最大的特征…

elasticsearch的学习(四):elasticsearch的一些基本概念

简介 elasticsearch的一些基本概念。 核心概念 索引&#xff1a;一个拥有相似特征的文档的集合。 类型&#xff1a;在索引中定义&#xff0c;是索引的一个逻辑上的分类&#xff0c;版本7以上已经弃用了。 文档&#xff1a;可被索引的基础信息单元&#xff0c;即一条数据&a…

【Android Studio】Intent实现两个Activity页面的跳转(基于Empty View Activity)

文章目录 为什么使用EmptyViewActivity而不是EmptyActivity准备工作&#xff1a;创建EmptyViewActivity项目准备工作&#xff1a;新建SecondActivity调试一下原始项目添加button写跳转方法测试布局技巧 为什么使用EmptyViewActivity而不是EmptyActivity 因为笔者使用的Android…

基于STM32的环境监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码传感器读取代码应用场景 家居环境监测工业环境监测常见问题及解决方案 常见问题解决方案结论 1. 引言 环境监测系统在我们的日常生活和工作中变得越来越重要。通过监测空气质量、…

LVS部署DR集群

介绍 DR&#xff08;Direct Routing&#xff09;&#xff1a;直接路由&#xff0c;是LVS默认的模式&#xff0c;应用最广泛. 通过为请求报文重新封装一个MAC首部进行转发&#xff0c;源MAC是DIP所在的接口的MAC&#xff0c;目标MAC是某挑选出的RS的RIP所在接口的MAC地址. 整个…

主从复制原理及配置

角色不生效&#xff1a; 在配置文件中添加 activate_all_roles_on_loginon glibc安装&#xff0c;my.cnf在项目目录之下 rpm安装&#xff0c;my.cnf文件在/etc/my.cnf 主从复制 备份的三种类型&#xff1a; 热备份 物理备份 逻辑备份 HA&#xff1a;高可用集群 复制原理…

实现Kubernetes中的抢占式Pod与固定Pod的弹性伸缩:一项全面指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

c++STL中list介绍,模拟实现和list与vector对比

目录 前言 &#xff1a; 1. list的介绍及使用 1.1list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对…

GuLi商城-商品服务-API-新增商品-调用远程服务保存优惠等信息

优惠券服务要开启服务注册和发现功能: 会员服务要开启远程调用功能: 可以写在消费端: 我还是习惯写在服务提供者一端: package com.nanjing.gulimall.coupon.feign;import com.nanjing.common.to.SpuBoundTo; import com.nanjing.common.utils.R; import org.springframewo…

Docker安装portainer汉化版

1、拉取汉化版Portainer镜像 docker pull 6053537/portainer-ce 2、创建数据卷 为了保存Portainer的数据和配置&#xff0c;应该创建一个Docker卷&#xff1a; docker volume create portainer_data 3、运行Portainer容器 docker run -d \--name portainer \-p 9000:9000…

企业社会责任(CSR)国际标准对企业的发展有什么好处?

企业社会责任&#xff08;CSR&#xff09;国际标准对企业的发展具有多方面的好处&#xff0c;包括但不限于以下几点&#xff1a; 提升企业声誉和形象 ​符合国际标准展示了企业对社会和环境的积极关注&#xff0c;有助于在消费者、投资者、合作伙伴和公众中树立良好的声誉&…

MyBatis快速学习

目录 前言 MyBatis的具体使用 一些小工具&#xff1a;MyBatisX 常见问题&#xff1a; 1.表中字段名和实体属性名不一致 2.按条件查询&#xff08;单条件&#xff09;时的&#xff0c;查询条件怎么编写 3.按条件查询&#xff08;多条件&#xff09; 4.多条件查询时&…