首页 > 其他分享 >学习笔记二

学习笔记二

时间:2023-10-27 18:22:06浏览次数:44  
标签:文件 调用 缓冲 fread 笔记 学习 FILE 缓冲区

I/O库函数

I/O 数据库是一系列文件操作函数,既方便用户使用,又提高了整体效率。

看起来比较优质的 I/O 库函数汇总,链接如下:https://blog.csdn.net/xiaxiaoyule/article/details/44050507?utm_source=app&app_version=4.15.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

一、I/O数据库与系统调用

几乎每个支持C语言编程的操作系统都可以提供文件I/O库函数。

 

二、I/O 库函数的算法

(一)程序必须给每个文件声明一个指针变量,这个变量的类型为FILE*,当它处于活动状态时为流所用。

 

(二)流通过fopen函数打开,打开的时候必须指定需要访问的文件或者设备以及访问方式。例如: FILE* fopen(const char* filename,const char*mode)

 

(三)根据需要对文件进行读取和写入。

 

(四)fread算法:

fread算法如下:

(1)在第一次调用 fread()时,FILE结构体的缓冲区是空的,fread()使用保存的文件描述符fd发出一个

n=read(fd,fbuffer,BLKSIZE);

系统调用,用数据块填充内部的 fbuf [] 的指针、计数器和状态变量,以表明内部缓冲区有一个数据块。

尝试满足来自内部缓冲区的fread()调用。

若,内部缓冲区没有足够的数据,则会再发出一个 read()系统调用来填充内部缓冲区,将数据从内部缓冲区传输到程序缓冲区,直到满足程序所需的字节数。将数据复制到程序缓冲区后,他会更新内部缓冲区的指针、计数器等,为下一个fread()做好准备。然后返回实际读取的数据对象;

(2)在之后的每次fread()调用中,它都尝试满足来自FILE结构体内部缓冲区的调用。当缓冲区变成空时,它就会发出 read()系统调用来重新填充内部缓冲区。

因此,fread()一方面接受来自用户程序的调用;另一方面向操作系统内核发出read()系统调用。除了系统调用之外,所有fread()处理都在用户模式映像中执行。它只在需要的时候才会进入操作系统内核,并且以一种最高效匹配文件的方式进入。会提供自动缓冲机制。

 

(五)fwrite()算法

fwrite()在每次被调用的时候,它将数据写入内部缓冲区,并调整缓冲区的指针、计数器和状态变量,以跟踪缓冲区的字节数。如果缓冲区已满,则发出write()系统调用,将整个缓冲区写入操作系统内核。

 

()fclose函数可以关闭文件流的局部缓冲区,然后,它会发出一个close(fd)系统调用来关闭 FILE 结构体中的文件描述。最后释放 FILE 结构体,并将 FILE 指针重置为NULL。

例如: fclose(FILE* steam) ###### I/O函数列表:

 

 

 

三、使用I/O库函数或系统调用

·fread() 和 fwrite() 将数据从内核复制到内部缓冲区,然后从内部缓冲区将数据复制到程序缓冲区。

·read()将数据直接复制到程序的缓冲区。

所以,它传输了两次数据;

而 read() 将数据从内核直接复制到程序的缓冲区,只复制了一次。因此对于BLKSIZE为单位的读/写数据来说,read()比 fread()更高效,同样,write()比 fwrite()更高效。

当然,以上的高效是相对于BLKSIZE为单位的读/写数据来说的。

 

四、I/O库模式

r+:表示读/写,不会阶段文件;

w+:表示读/写,但是会先截断文件;若文件不存在,创建文件;

a+:表示通过追加进行读/写,文件不存在创建文件。

 

五、文件流缓冲

  • 无缓冲

  • 行缓冲

  • 全缓冲 通过fopen()创建文件流之后,在对其执行任何操作之前,用户均可发出一个 setvbuf(FILE *stream, char *buf, int node, int size) 调用来设置缓冲区(buf)、缓冲区大小(size)和缓冲方案(mode),它们必须是以下一个宏:

  • IONBUF:无缓冲

  • IOLBUF:行缓冲

  • IOFBUF:全缓冲 此外,还有其他的setbuf()函数,是setvbuf()的变体。对于行缓冲流或全缓冲流,可用fflush(stream)立即清除流的缓冲区。

Chatgpt测试如下图所示:

 

 

 

标签:文件,调用,缓冲,fread,笔记,学习,FILE,缓冲区
From: https://www.cnblogs.com/20191128hzy/p/17792942.html

相关文章

  • 学习笔记一
    引言部分(第一章)安装虚拟机并下载Linux因学院网速较慢,所以我拷贝了同学之前下载好的虚拟机,似乎这个虚拟机也是从老师那里来的。在Linux环境下运行C语言代码创建一个名为test的C语言文件按“i"编辑该文件按ESC键退出编辑,“shift+:”输入”wq“保存并退出编译te......
  • 802.11无线网络权威指南学习笔记
    以前在CSDN博客写的,后来不用CSDN,改用cnblogs,没想到在搜索资料时发现了以前被人转载的笔记,做个记录https://blog.csdn.net/machiner1/article/details/41726539......
  • CompletableFuture源码学习
    了解到CompletableFuture的基础用法之后,我们不禁好奇,以前的Future模式不支持如此好用的异步编程,CompletableFuture是如何做到的呢?这就需要我们去阅读源码了,通过源码我们才能了解到其设计思想和实现方式,我们分析下supplyAsync和thenApplyAsync这两个,并且是提供线程池的接口,因为......
  • cmake学习
    基础的一个cmake文件:cmake_minimum_required(VERSION3.25)project(app)set(CMAKE_CXX_STANDARD20)set(EXECUTABLE_OUTPUT_PATHbin/)set(SRC_LISTsrc/main.cppsrc/util.cpp)add_executable(app${SRC_LIST})target_include_directories(appPUBLICinclude/)......
  • 「学习笔记」网络流
    「学习笔记」网络流点击查看目录目录「学习笔记」网络流知识点一些基础定义最大流Ford-Fulkerson算法(增广路算法)Edmonds-Karp算法Dinic算法最小割费用流EK费用流ZKW费用流例题[SCOI2007]蜥蜴[SDOI2015]星际战争士兵占领[HNOI2007]紧急疏散EVACUATE[SDOI2009]晨跑[SDO......
  • docker 数据卷-学习
    容器数据卷容器数据存储路径同步在宿主机文件目录做数据持久化保存(目录挂载、映射)不进行这一步,会导致删除容器后,数据直接丢失。容器间数据卷也可以进行共享数据卷的使用,类似于Linux下对目录或文件进行mount1、宿主机目录映射容器内部目录-v宿主机目录:容器内目录(......
  • 第六周学习笔记
    Linux进程管理多任务处理在编程中,多任务处理是指同时执行多个任务或进程的能力。这种能力可以通过并发编程来实现,其中任务可以是同时执行的线程、进程或协程。进程的概念进程:进程是对映像的执行在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制......
  • 第七周学习笔记
    并发编程并行计算导论顺序算法与并行算法顺序算法:begin  step_1  step_2  ……  step_nend//nextstep并行算法:cobegin  task_1  task_2  ……  task_ncoend//nextstep并行性与并发性在单CPU系统中,一次只能执行一个任务。不同的任务只能......
  • 按摩学习笔记
    特点按摩,以经络和解剖作为理论基础。具有:经济简便,随时随地,简单有效的特点。能够起到:放松肌肉,舒筋活血,振奋精神,消除病痛等作用。亲身体会以上特点,是我个人经过亲身体会,比较认同的部分。最深刻的体会有:1.个人因为工作经常久坐,导致翻译搜索复制......
  • 《用户故事与敏捷方法》阅读笔记(三)
    用户故事具有多种好处:①用户故事强调口头沟通:自古以来,口头表达是十分重要的。而且相比于书面书写的易产生歧义,口头表述更见简单明了,需求文档也是如此。②人人都可以理解用户故事:相比于一些墨守成规的软件需求里的技术术语,用户故事使用的语言更容易使用户理解,简......