通过read()读文件
一、在POSIX中的定义
#include <unistd.h> ssize_t read(int fd, void *buf, size_t len);
二、调用read()的可能结果
2.1 返回值为len;读取到的所有len个字节都被存储在buf中,结果和预期的一致;
2.2 返回值小于len大于0;读取到的字节被存储到buf中,原因:
(1)在读取过程中信号中断或在读取中出错;
(2)可读的数据大于0字节小于len字节在读取len字节之前到达EOF
2.3 返回0,表示EOF,没有更多的数据可读;
2.4 由于当前没有数据可用,调用阻塞;在非阻塞模式下,不会发生这种情况;
2.5 返回-1,并把errno置为EINTR,这表示在读取任何字节之前收到信号;调用可以重新执行;
2.6 返回-1,并把errno置为非EINTR或EAGAIN的一个值,这表示更严重的错误,重新执行读操作不会成功
三、读入所有字节
ssize_t ret;
while (len != && (ret = read(fd, buf, len)) != ) {
if (ret == -) {
if (errno == EINTR) {
continue;
}
perror("read");
break;
}
len -= ret;
buf += ret;
}
四、非阻塞读
文件描述符以非阻塞模式打开(即open调用中指定参数O_NONBLOCK),并且没有数据可读,read调用会返回-1,并设置
errno值为EAGAIN,而不是阻塞;当以非阻塞模式读文件时,必须检查EAGAIN,否则可能因为丢失数据导致严重错误
char buf[BUFSIZ];
ssize_t nr; start:
nr = read(fd, buf, BUFSIZ);
if (nr == -) {
if (errno == EINTR) {
goto start;
}
if (errno == EAGIN) {
// 稍后重新读取
} else {
// 发生错误
}
}
通过read()读文件的更多相关文章
- GoLang几种读文件方式的比较
GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...
- Python之路 day2 按行读文件
#1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: line = fil ...
- java的读文件操作
java读取文件内容,可以作如下理解: 首先获得一个文件句柄,File file = new File():file即为文件句柄.两人之间联通电话网络了,就可以开始打电话了. 通过这条线路读取甲方的信 ...
- PHP使用feof()函数读文件的方法
这篇文章主要介绍了PHP使用feof()函数读文件的方法,以实例形式对比了正确与错误的用法,阐明了feof()函数的使用技巧,需要的朋友可以参考下 本文实例讲述了PHP使用feof()函数读文件的方法 ...
- Java基础之读文件——使用输入流读取二进制文件(StreamInputFromFile)
控制台程序,读取Java基础之读文件部分(StreamOutputToFile)写入的50个fibonacci数字. import java.nio.file.*; import java.nio.* ...
- c++中ifstream读文件的问题(关于eof())
今天帮别人找BUG,是一段关于c++读写文件的问题,使用的是ifstream与outstream类,关于ofstream与ifstream的用法,此处不再獒述,见代码: #include<ios ...
- python (11)文件的读写 按行读文件
读文件: 读取文件 f = open('\info.txt') fil = f.read() f.close() 按行读文件: f = open("info.txt") while ...
- Python学习入门基础教程(learning Python)--5.2 Python读文件基础
上节简单的说明了一下Pyhon下的文件读写基本流程,从本节开始,我们做几个小例子来具体展示一下Python下的文件操作,本节主要是详细讲述Python的文件读操作. 下面举一个例子,例子的功能是读取当 ...
- Python按行读文件对比
1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: lin ...
- java 读文件 解析
[Java]读取文件方法大全 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** ...
随机推荐
- Excel 使用AutoFill提示“类Range的AutoFill方法无效”
今天遇到一个神奇的问题,之前一直使用很好的代码突然报错:“类Range的AutoFill方法无效”,在网上搜索了一番,感觉没有一个与我遇到的情况相同的.debug,查看一下代码,发现程序里,AutoF ...
- Oracle中rownum和rowid的理解
rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的.而rowid是“物理”编号.若数据库文件没有移动,则每行的 rowid一般是固定 ...
- Android 判断是否有声音在播放
在Android中,我们可以通过AudioManager来判断是否有声音在播放. 实例1: 源码地址: PhoneWindowManager.java (frameworks\base\policy\ ...
- BZOJ 3164: [Heoi2013]Eden的博弈问题
3164: [Heoi2013]Eden的博弈问题 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 134 Solved: 98[Submit][St ...
- 【BZOJ2427】[HAOI2010]软件安装(动态规划,Tarjan)
[BZOJ2427][HAOI2010]软件安装(动态规划,Tarjan) 题面 BZOJ 洛谷 题解 看到这类题目就应该要意识到依赖关系显然是可以成环的. 注意到这样一个性质,依赖关系最多只有一个, ...
- LOCALDB安装和连接
关于LOCALDB的详细文档说明,包含安装,连接,共享连接等操作 https://technet.microsoft.com/zh-cn/hh510202 目的: 调试程序没有安装 sql serv ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
- luogu3645 [Apio2015]雅加达的摩天大楼 (分块+dijkstra)
我们是想跑最短路的 我们有两种建图方式: 1.对于每个doge i,连向B[j]==B[i]+P[i]*k ,k=..,-2,-1,0,1,2,... ,边权=|k|,这样连的复杂度是$O(N\sum ...
- .NET:C# 如何实现的闭包?
背景 C# 在编译器层面为我们提供了闭包机制(Java7 和 Go 也是这种思路),本文简单的做个解释. 背景知识 你必须了解:引用类型.值类型.引用.对象.值类型的值(简称值). 关于引用.对象和值 ...
- jsp关闭或刷新浏览器(解决浏览器不兼容),请求后台onbeforeunload、onunload
jsp关闭或刷新浏览器(解决浏览器不兼容),请求后台 onbeforeunload.onunload 1.看代码: function test(e) { var json = "退出,清理 ...