`

C的文件读写与缓存

阅读更多
首先说说不带缓存的I/O,UNIX的文件I/O read、write是不带缓存的。不带缓存是指每个read、write都调用内核的一个系统调用,它们是POSIX.1的组成部分。二者的原型为:

    ssize_t read( int filedes, void* buf, size_t nbytes );    // 若成功返回读到的字节数

    ssize_t write( int filedes, const void* buf, size_t nbytes );    // 若成功返回已写的字节数

    注意,上面的buf不是指read、write带缓存,而是当read时用来存放读出的字节,write时存放待写的字节。对于read,nbytes表示每次最多读的字节数。但这个块的大小将影响I/O的效率,其值和具体系统有关。

    补充一下,不带缓存的I/O对文件描述符操作,下面带缓存的I/O是针对流的。

    标准I/O库就是带缓存的I/O,它由ANSI C标准说明。当然,标准I/O最终都会调用上面的I/O例程。标准I/O库代替用户处理很多细节,比如缓存分配、以优化长度执行I/O等。

    标准I/O提供缓存的目的就是减少调用read和write的次数,它对每个I/O流自动进行缓存管理(标准I/O函数通常调用malloc来分配缓存)。它提供了三种类型的缓存:

    1) 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。

    2) 行缓存。当输入输出遇到新行符或缓存满时,才由标准I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。

    3) 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。

    一般而言,由系统选择缓存的长度,并自动分配。标准I/O库在关闭流的时候自动释放缓存。

    在标准I / O库中,一个效率不高的不足之处是需要复制的数据量。当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准I / O缓存之间(当调用read和write时),第二次是在标准I / O缓存(通常系统分配和管理)和用户程序中的行缓存(fgets的参数就需要一个用户行缓存指针)之间。

    不管上面讲的到底懂没懂,记住一点:

    使用标准I / O例程的一个优点是无需考虑缓存及最佳I / O长度的选择,并且它并不比直接调用read、write慢多少。

带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制。不带缓存的文件操作通常都是系统提供的系统调用,更加低级,直接从硬盘中读取和写入文件,由于IO瓶颈的原因,速度并不如意,而且原子操作需要程序员自己保证,但使用得当的话效率并不差。另外标准库中的带缓存文件IO 是调用系统提供的不带缓存IO实现的。


“术语不带缓冲指的是每个read和write都调用嗯内核中的一个系统调用。所有的磁盘I/O都要经过内核的块缓冲(也称内核的缓冲区高速缓存),唯一例外的是对原始磁盘设备的I/O。既然read或write的数据都要被内核缓冲,那么术语“不带缓冲的I/O“指的是在用户的进程中对这两个函数不会自动缓冲,每次read或write就要进行一次系统调用。“--------摘自<unix环境编程>
0
0
分享到:
评论

相关推荐

    c语言文件读写操作代码.rar

    本文将详细讲解C语言中如何进行文件的读写操作,并结合提供的"c语言文件读写操作代码.docx"文档,探讨相关的编程实践。 一、文件操作的基本概念 在C语言中,文件被视为字节流,通过标准库中的`stdio.h`头文件提供...

    C语言文件读写操作总结.md

    ### C语言文件读写操作知识点总结 #### 一、文件的打开操作 文件的打开是进行文件读写操作的第一步,通常使用`fopen()`函数完成。`fopen()`函数的基本格式为: ```c fopen(char *filename, char *type); ``` - *...

    c语言读写ini文件

    在C语言中,读写INI文件是一个常见的任务,特别是在配置文件处理方面。INI文件是一种简单的文本格式,用于存储用户配置信息或程序设置。由于题目提到不使用Win32系统的DLL,我们将探讨如何纯C语言实现读写INI文件的...

    c语言文件读写txt文件操作代码示例

    在C语言中,进行文本文件的读写是编程的基础技能之一。C语言提供了标准库函数,如`fopen`, `fprintf`, `fscanf`, `fread`, `fwrite`, `fclose`等,用于处理文件操作。下面我们将详细探讨如何在C语言中进行TXT文件的...

    USV-path-c语言文件读写操作代码

    在C语言中,文件读写操作是编程的基本技能之一,广泛应用于数据持久化、日志记录、文件处理等场景。本篇文章将详细讲解如何在C语言中进行文件的读取和写入操作,以及相关的重要知识点。 首先,我们需要了解C语言中...

    Linux C大文件的创建和读写速率

    本篇将详细介绍如何在Linux下使用C语言创建和读写大文件,并探讨如何优化读写速率。 1. **大文件限制**: 在32位系统中,标准的`stdio.h`库函数如`fopen`、`fwrite`和`fread`受限于2GB文件大小。为处理大于2GB的...

    CH376S读CSV文件_ch376s_c_读写csv文件_

    总的来说,通过理解CSV文件格式和CH376S的文件操作API,开发者可以在STM32F103RCT6上实现高效且可靠的CSV文件读写,满足各种数据处理需求。在开发过程中,不断调试和测试,确保程序的稳定性和兼容性,是成功的关键。

    C语言实现的读写配置文件函数,与Windows API函数功能一样

    本篇将详细介绍如何使用C语言来实现一个类似Windows API功能的配置文件读写函数,以及这些函数的工作原理和实现细节。 配置文件(如.ini文件)常用于存储应用程序的设置和参数,方便程序在启动时读取,运行时修改或...

    重叠IO实现的大文件读写.zip_C++读写大文件_c#大文件_大文件 c_大文件读写_读写大文件

    本文将深入探讨如何使用C++和C#这两种编程语言实现高效的大文件读写操作,以及重叠I/O(Overlapped I/O)技术的应用。 首先,C++和C#都提供了多种方法来读写大文件。在C++中,`fstream`库是处理文件的基础,包括`...

    C++读写ini配置文件

    通过以上设计,我们可以构建一个强大且灵活的ini配置文件读写库。"rwconfig.cpp"和"rwconfig.h"文件可能已经实现这些功能,通过它们,你可以方便地在C++项目中管理配置信息,无需从头开始编写代码。只需根据具体需求...

    C和C++文件读写操作

    ### C和C++文件读写操作详解 #### 一、概述 本文将详细介绍C和C++中的文件读写操作,包括文件操作的基本概念、常用函数及其使用方法,并提供实例帮助理解。 #### 二、基本概念 在C语言中,文件操作主要通过两种...

    C 语言常见文件读写操作示例代码详解

    本文详细介绍并举例了如何使用C标准库进行文件读写操作的方法,涵盖文本与二进制两种形式的数据交互方式以及具体应用技巧,并指导开发者如何正确地进行异常捕获、缓存管理以及选用正确的文件访问模式。 适合对象为...

    C/C++实现FAT文件系统的读写

    本篇文章将深入探讨如何在C/C++语言环境中,不依赖Windows API来实现对FAT文件系统的读写操作。 首先,理解FAT文件系统的核心组成部分至关重要。这包括主引导记录(MBR)、扇区、簇、FAT表、根目录以及数据区域。...

    Java文件读写.pdf

    Java文件读写是Java编程语言中基础且重要的操作,用于处理磁盘上的数据。本文将详细探讨Java如何进行文件读写,并提供相关的示例代码。 首先,读取文件时,Java提供了多种类来实现这一功能。`FileInputStream`是...

    c,c++高手实现xml文件读写解析底层

    综上所述,"c,c++高手实现xml文件读写解析底层"涉及到的技能点涵盖了XML的基本概念、解析方法、C/C++库选择、读写操作、错误处理和性能优化等多个方面。实际应用中,开发者需要根据项目需求和资源限制选择合适的解析...

    C++二进制文件读写

    C/C++实现简单的二进制文件读取和写入示例 1.包含如何读取和写入数字,以及用缓存按字节读取 2.采用标准输入和输出函数创建、打开、关闭文本文件或二进制文件

    python文件读写.pdf

    Python 文件读写 Python 语言中,文件读写是通过 open 函数或 file 对象来实现的。open 函数或 file 对象提供了多种模式来打开文件,包括读、写、追加、读写等模式。在使用 open 函数或 file 对象时,需要指定...

    ASP读写INI文件

    首先,`RWIniFile.inc` 文件很可能是包含一个或多个ASP函数的库,这些函数用于读取和写入.INI文件。通常,这样的函数会包括`ReadIni` 和 `WriteIni`,分别用于从.INI文件中获取值和向.INI文件中写入值。例如: ```...

    c语言文件,永久保存信息

    【C语言文件处理】在C语言中,文件处理是程序设计的重要组成部分,它允许程序员将数据持久地存储到外部介质上,例如磁盘。文件可以是各种类型的数据集合,如文章、统计表或编译后的程序。C语言将文件分为两类:文本...

    c语言的文件操作,其实很简单

    对于更复杂的文件操作,比如文件定位,可以使用`fseek()`函数改变文件读写位置,`ftell()`获取当前位置。此外,`feof()`和`ferror()`分别用来检测文件是否结束和是否存在错误。 在数据库文件操作方面,C语言本身并...

Global site tag (gtag.js) - Google Analytics