C语言读写文件函数:read/write,pread/pwrite,readv/writev,preadv/pwritev,preadv2/pwritev2

这篇具有很好参考价值的文章主要介绍了C语言读写文件函数:read/write,pread/pwrite,readv/writev,preadv/pwritev,preadv2/pwritev2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数原型

// 最基本的read,write函数,读写一个buffer的数据
// read, write - read from or write to a file descriptor
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

// 在read,write函数基础上,可指定位置偏移量,从fd指定的文件offset处进行读写
// pread, pwrite - read from or write to a file descriptor at a given offset
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

// readv,writev系列函数,可一次性读写多个不连续的buffer,把buffer数组中的内容写入到文件或者从一个文件读取内容到buffer数组
// 注意第二个参数是struct iovec指针,可以传入指针或数组。每个struct iovec都是一段固定长度的buffer。
// 这些函数定义在头文件<sys/uio.h>中
// readv, writev, preadv, pwritev, preadv2, pwritev2 - read or write data into multiple buffers
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
// 在readv/writev基础上,增加了指定位置偏移量的参数
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
// 在preadv/pwritev基础上,增加了flag,如RWF_DSYNC, RWF_SYNC, RWF_HIPRI, RWF_NOWAIT, RWF_APPEND等,
// 控制读写时同步、优先级等行为
ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);

// struct iovec定义,起始地址和长度
struct iovec {
    void  *iov_base;    /* Starting address */
    size_t iov_len;     /* Number of bytes to transfer */
};

示例程序

read/write/pread/pwrite函数比较直观,这里仅示例readv/writev函数用法。
把程序中定义的buf通过writev函数输出到屏幕上。

#include <sys/uio.h>
#include <string.h>
#include <unistd.h>

int main() {

    char* buf1 = "hello ";
    char* buf2 = "world\n";

    struct iovec vec[2];				// iovec数组,输出buf

    vec[0].iov_base = buf1;				// 赋值方式1
    vec[0].iov_len = strlen(buf1);
//    vec[1].iov_base = buf2;
//    vec[1].iov_len = strlen(buf2);
    vec[1] = {							// 赋值方式2
            .iov_base = buf2,
            .iov_len = strlen(buf2)
    };

    writev(STDOUT_FILENO, vec, 2);		// writev输出到指定文件,这里是标准输出


    char* buf3 = "Hi ";
    char* buf4 = "barbie!\n";
    struct iovec *pv;					// 使用iovec指针
    pv = new iovec[] {					// 为iovec指针赋值
            {.iov_base = buf3, .iov_len = strlen(buf3)},
            {.iov_base = buf4, .iov_len = strlen(buf4)},
    };
    writev(STDOUT_FILENO, pv, 2);		// 把iovec指针指向的buf内容输出到stdout

    return 0;
}

分析

读写多个缓冲区,有几种策略:

  1. 调用read、write分别操作多次
    这种方式多次切换内核态,效率最低。

  2. 把多个缓冲区复制合并到同一个大的缓冲区中,一次read、write操作
    调用一次系统调用,切换一次内核态,调用开销低。
    效率主要取决于复制操作,当数据量比较小,复制开销不大时,效率和readv/writev接近。

  3. 调用readv、writev一次性操作多个缓冲区
    系统调用一次,开销低。
    当多块缓冲区数据较多,赋值开销增大时,这种方式比上述第二种方法更高效。文章来源地址https://www.toymoban.com/news/detail-655178.html

到了这里,关于C语言读写文件函数:read/write,pread/pwrite,readv/writev,preadv/pwritev,preadv2/pwritev2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IO学习系列之使用read和write复制文件内容

    read函数: 功能:从 文件fd 中读取 count个字节 ,存放进 指针buf ; 具体内容: write函数: 功能:把 指针buf 中的内容,写 count个字节 到 文件fd 中; 具体内容: 示例代码:

    2024年02月07日
    浏览(34)
  • Linux-0.11 文件系统read_write.c详解

    该模块实现了文件系统通用的读写的方法read/write/lseek。 根据文件类型的不同,在内部将调用不同的方法。如果是管道文件,则调用pipe.c中的读写方法,如果是字符设备,则会调用char_dev.c中的方法,如果是目录或者普通文件,将调用file_dev.c中的读写方法,如果是块设备文件,

    2024年02月06日
    浏览(34)
  • C#,入门教程(28)——文件夹(目录)、文件读(Read)与写(Write)的基础知识

    上一篇:   C#,入门教程(27)——应用程序(Application)的基础知识 https://blog.csdn.net/beijinghorn/article/details/125094837 C#知识比你的预期简单的多,但也远远超乎你的想象! 与 文件 相关的知识,不算多。 作为初学者,先学习 文本文件 的读写,就足够应付好几年了。 文件 自然是

    2024年01月23日
    浏览(50)
  • Python---文件、基本操作:打开open,写入write,关闭close,读取read/readlines,移动光标seek,mode模式

    文件: 内存中存放的数据在计算机关机后就会消失。 要长久保存数据 ,就要使用硬盘、光盘、U 盘等设备。 为了便于数据的管理和检索,引入了 “文件 ”的概念。 像移动硬盘,内存卡,网盘等等。 一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予

    2024年02月03日
    浏览(43)
  • HAL库函数中的HAL_I2C_Mem_Write /HAL_I2C_Mem_Read中的DevAddress解析

    在HAL库函数中的HAL_I2C_Mem_Write /HAL_I2C_Mem_Read两个函数的作用就是玩IIC设备中写入/读取多个直接的数据, 函数原型: 两个函传入的参数中都需要DevAddress, 以AT24C02为例, 上面的这个是EEPROM设备的写地址和读地址,,一般是这种定义的,但是在野火的HAL案例中 这个是写地址,为什么不定义

    2024年02月11日
    浏览(44)
  • Linux文件写入操作:write函数的使用

    write函数定义 :write函数是基于Linux系统中的一项函数调用,主要用于在打开/创建的文件中 写入数据。 write函数包含的头文件 : write函数的格式原型 : write函数中的三项参数 : ① int fd open一个文件,就会返回到文件描述符中,对文件后续的操作都需要用到文件描述符。 ②

    2024年02月01日
    浏览(36)
  • Python 3 使用 write()、writelines() 函数写入文件

    1 使用 write() 函数,将字符串(或字节串,仅适用写入二进制文件中)写入文件中。 2 使用 writelines() 函数,将字符串列表写入文件中。 附录: mode参数  r 默认以只读方式打开文件。文件的指针将会放在文件的开头。 rb 以二进制格式打开一个文件用于只读。文件指针将会放

    2024年02月03日
    浏览(26)
  • R语言【utils】——write.table(),write.csv(),write.csv2():将数据写入文件

    Package  utils  version 4.2.0 参数【x】 :要写入的对象,最好是矩阵或数据帧。如果不是,则尝试将其强制转换为数据帧。 参数【file】 :命名文件的字符串或打开用于写入的连接。“”表示向控制台输出。 参数【append】 :逻辑值。只有当 参数【file】 是一个字符串时才相关。

    2024年01月22日
    浏览(35)
  • read/write和fread/fwrite介绍

    UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write 这里简单的介绍一下他们的区别。 1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call。 也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系

    2024年02月09日
    浏览(29)
  • 【Python】文件操作 ② ( 文件操作 | 读取文件 | read 函数 | readline 函数 | readlines 函数 )

    在 Python 中 , 操作文件 的流程如下 : 打开文件 读写文件 关闭文件 文件打开后 , 可以获得一个 _io.TextIOWrapper 类型的文件对象 ; 调用 文件对象#read 函数 , 可以 读取文件对象中的数据 ; read 函数默认可以读取文件中的所有数据 , 如果为 read 函数传入一个数字作为参数 , 那么读取

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包