read函数、write函数
read函数从打开的设备或文件中读取数据。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0
参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。
有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:
1.读常规文件时,在读到count个字节之前已到达文件末尾。
2.从终端设备读,通常以行为单位,读到换行符就返回了。
情况1代码演示:
#include "./common/head.h"/*功能:*打开一个文件,第一次读取10个字符,第2次再读取10个字符*验证当读到文件末尾时,read的返回参数*注意:文件中换行也占一个字符,如test.txt中5和h后面就有一个换行,可以用NodePad++软件来看该文件中所有隐藏的字符,便于调试。*test.txt如下(用ll命令查看,占15字节): 12345 abcdefgh */int main(int argc, char **argv) {if(argc != 2){ //./a.out test.txtprintf("usage: cmd filename\n");exit(1);}int fd = open(argv[1], O_RDONLY);if(fd < 0){perror("open");exit(1);}int n;char buff[20] = {0};n = read(fd, buff, 10); //第1次读取10个字节prinrf("%d bytes has readed\n", n); //文件未被读完,打印10//打印读到的字节for(int i = 0; i < n; i++){printf("%c", buff[i]);}printf("\n");n = read(fd, buff, 10); //第2次读取10个字节,当读到第5个字节时,已读到文件末尾prinrf("%d bytes has readed\n", n); //文件未被读完,打印5for(int i = 0; i < n; i++){printf("%c", buff[i]);}printf("\n");close(fd);return 0; }
结果:
解析:
第一次读取10个字节:
12345\nabcd
代码打印换行
第二次读取5个字节(虽然代码中count传入的是10,但已经读到文件末尾,只读到5个字符):
efgh\n
代码打印换行
情况2代码演示:
#include "common/head.h"/*功能:*从标准输入读取数据,并打印出来 */int main() {char buff[20] = {0};size_t n = read(STDIN_FILENO, buff, 10); //从标准输入中读取10字节。STDIN_FILENO宏在unistd.h中被定义0,代表标准输入if(n < 0){perror("READ STDIN");exit(1);}//当终端输入回车时,read函数才会开始读,并执行到这里printf("%d bytes has readed from stdin\n", n);for(int i = 0; i < n; i++){printf("%c", buff[i]);}putchar(10); //\n的ascii码是10,相当于输出一个换行return 0; }
结果:
解析:
在终端输入:
1 2 3\n
终端设备以换行为单位,read函数开始执行,读到6个字符(包括空格和换行)
然后调用printf打印读到的字符
最后puchar一个换行
拓展:
如果终端的输入超过10个字节,剩下的字符会被bash接住,并且尝试解析这些字符所代表的命令。
产生这一现象是因为标准输入中的数据像水流一样传输过来,当bash调用了./a.out后,bash会转入后台运行,当./a.out程序结束后,bash又从输入流中获取数据。
write函数向打开的设备或文件中写数据。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
返回值:成功返回写入的字节数,出错返回-1并设置errno
read函数、write函数相关推荐
- Java箭头函数,lambda函数
Java箭头函数,lambda函数 lambda表达式实质就是一种语法糖,(建议尽量不要使用lambda表达式,代码太简洁,难懂,难以调试) lambda表达式的简单例子: 不需要参数,返回5 ()- ...
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- python nums函数_Python函数
一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...
- Python源码学习:Python函数浅析-函数闭包
Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇分析了函数参数的分析后,本文分析函数闭包的实现.函数闭包即函数定义和函数表达式 ...
- querywrapper or and嵌套_两个经常用的逻辑函数AND函数,OR函数
在逻辑函数里AND函数,OR函数是使用频率是比较高的函数,但像NOT函数和XOR两个函数就略显鸡肋了. 今天我们重点对前两个函数进行讲述,后两个大家可以自行查看下,知道就行了,等哪天可以用上的时候再进 ...
- R语言使用trimws函数:trimws函数去除(删除、remove)字符串头尾的空格
R语言使用trimws函数:trimws函数去除(删除.remove)字符串头尾的空格 目录 R语言使用trimws函数:trimws函数去除(删除.remove)字符串头尾的空格
- R语言使用integrate函数进行函数积分计算实战
R语言使用integrate函数进行函数积分计算实战 目录 R语言使用integrate函数进行函数积分计算实战 #自定义函数 #积分操作
- R语言ggplot2使用geom_line函数geom_point函数可视化哑铃图、并对哑铃图进行排序(reorder dumbbell plot)
R语言ggplot2使用geom_line函数geom_point函数可视化哑铃图.并对哑铃图进行排序(reorder dumbbell plot) 目录
- R语言ggplot2可视化:将dataframe和数据列名称传递给函数通过函数进行ggplot2可视化输出
R语言ggplot2可视化:将dataframe和数据列名称传递给函数通过函数进行ggplot2可视化输出 目录
- R语言max函数min函数计算各种数据对象最大值最小值实战
R语言max函数min函数计算各种数据对象最大值最小值实战 目录 R语言max函数min函数计算各种数据对象最大值最小值实战 #基本语法
最新文章
- EnterpriseDB Migration 迁移工具使用测试(2)
- 水星逆行,诸事不宜,瞬间爆炸。
- 皮一皮:直男的拍摄水平...
- mysql常用命令,mysql语法,mysql登陆、创建数据库、创建用户、更改密码、为用户授权...
- how is navigation list item click event handled - actually no logic done
- atcoder 076
- java学习(81):静态代码块
- mysql的四层架构_分布式数据库服务器的四层架构
- java list容器_Java 容器列表(三)- ArrayList
- k8s 安装_二进制安装k8s集群总结
- 如何在一台window系统上演示Erlang分布式程序
- java 开源客服系统_编程浪子客服系统开源啦
- 新会计准则与旧版内容的不同比较
- 爬取今日头条新闻,并导入execle中(主要用了selenium)
- 张萌韩墨羽——Toolbar和DrawerLayout+SlideMenu 2种方式实现抽屉侧滑
- Android 屏蔽Power键 Home键
- Scrapy项目 - 数据简析 - 实现豆瓣 Top250 电影信息爬取的爬虫设计
- 计算机与模拟实验的论文,作业模拟论文,关于森林作业的计算机模拟相关参考文献资料-免费论文范文...
- Antd组件库的使用
- PowerPoint2007无法将Excel图表转换为图形对象