linux如何拿到文件的返回值,linux 下read函数返回值分析
原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003
read函数是Linux下不带缓存的文件I/O操作函数之一,所谓的不带缓存是指一个函数只调用系统中的一个函数。另外还有open、write、lseek、close,它们虽然不是ANSI
C的组成部分,但是POSIX的组成部分。
在对read的使用过程中,发现对其返回值的处理比较重要,这里做一下总结。
read函数原型:
ssize_t read(int fd,void *buf,size_t count)
函数返回值分为下面几种情况:
1、如果读取成功,则返回实际读到的字节数。这里又有两种情况:一是如果在读完count要求字节之前已经到达文件的末尾,那么实际返回的字节数将
小于count值,但是仍然大于0;二是在读完count要求字节之前,仍然没有到达文件的末尾,这是实际返回的字节数等于要求的count值。
2、如果读取时已经到达文件的末尾,则返回0。
3、如果出错,则返回-1。
这样也就是说分为>0 <0
=0三种情况进行讨论。在有的时候,<0
=0可以合为一种情况进行处理。这要根据程序的需要进行处理。
实例分析:
-------------------------------
#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 35
int main(void)
{
int i,j,fd,size,len;
char *buf="Hello!I`m writing to this file!";
char buf_r[MAXSIZE];
len=strlen(buf);
//open
if((fd=open("/tmp/hello.c",O_CREAT | O_TRUNC |
O_RDWR,0666))<0) {
perror("open:");
exit(1);
}
else
printf("Open file:hello.c %d\n",fd);
//write
if((size=write(fd,buf,len))<0){
perror("write:");
exit(1);
}
else
printf("Write:%s\n\n\n",buf);
//test-read
printf("Now test starts...\n\n");
for(i=0;i<20;i++){
lseek(fd,0,SEEK_SET);
for(j=0;j
buf_r[j]=0; if((size=read(fd,buf_r,MAXSIZE-i))<0){
perror("read:");
exit(1);
}
else {
buf_r[MAXSIZE-i]='\0';
printf("string-len=%d,count=%d,size=%d\n",len,MAXSIZE-i,size);
printf("read from file:%s \n",buf_r);
}
} printf("\n\nNow test stops...\n");
//close
if(close(fd)<0){
perror("close:");
exit(1);
}
else
printf("close hello.c\n");
exit(0);
}
-------------------------------
结果如下:
-------------------------------
[armlinux@lqm test-read]$ ./write
Open file:hello.c 3
Write:Hello!I`m writing to this file!
Now test starts...
string-len=31,count=35,size=31
read from file:Hello!I`m writing to this file!
string-len=31,count=34,size=31
read from file:Hello!I`m writing to this file!
string-len=31,count=33,size=31
read from file:Hello!I`m writing to this file!
string-len=31,count=32,size=31
read from file:Hello!I`m writing to this file!
string-len=31,count=31,size=31
read from file:Hello!I`m writing to this file!
string-len=31,count=30,size=30
read from file:Hello!I`m writing to this file
string-len=31,count=29,size=29
read from file:Hello!I`m writing to this fil
string-len=31,count=28,size=28
read from file:Hello!I`m writing to this fi
string-len=31,count=27,size=27
read from file:Hello!I`m writing to this f
string-len=31,count=26,size=26
read from file:Hello!I`m writing to this string-len=31,count=25,size=25
read from file:Hello!I`m writing to this
string-len=31,count=24,size=24
read from file:Hello!I`m writing to thi
string-len=31,count=23,size=23
read from file:Hello!I`m writing to th
string-len=31,count=22,size=22
read from file:Hello!I`m writing to t
string-len=31,count=21,size=21
read from file:Hello!I`m writing to string-len=31,count=20,size=20
read from file:Hello!I`m writing to
string-len=31,count=19,size=19
read from file:Hello!I`m writing t
string-len=31,count=18,size=18
read from file:Hello!I`m writing string-len=31,count=17,size=17
read from file:Hello!I`m writing
string-len=31,count=16,size=16
read from file:Hello!I`m writin
Now test stops...
close hello.c
-------------------------------
现象:
测试部分中,string-len是测试文件内容的长度,count是要求读取的字节数,size是实际读取的字节数。可以观察出,开始
count>string-len,所以虽然读取成功,但是返回的实际字节数要小于要求的字节数。从count=string-len之后,实际返
回的字节数等于要求的字节数。
问题分析:
1、每次执行read函数之前,保证指定好起始位置,并且对buf初始化。
如果将
lseek(fd,0,SEEK_SET);
for(j=0;j
buf_r[j]=0;
移到for循环外,那么只能保证i=0时完成了上述工作。这是已经读到文件的末尾,所以后面的size应该全部为零。因为没有对buf_r初始化,所以读取内容没有变化。具体结果如下:
-------------------------------
[armlinux@lqm test-read]$ ./write
Open file:hello.c 3
Write:Hello!I`m writing to this file!
Now test starts...
string-len=31,count=35,size=31
read from file:Hello!I`m writing to this file!
string-len=31,count=34,size=0read from file:Hello!I`m writing to
this file!
string-len=31,count=33,size=0read from file:Hello!I`m writing to
this file!
...
...
Now test stops...
close hello.c
-------------------------------
2、对于一个数组,总是要自动分配一个\0作为结束,所以实际有效的buf长度就成为buf_r-1了。在本例中,倘若把MAXSIZE设为31,即等于string-len的长度。那么当你读取31个字符时,\0就没有了地方。如果把buf_r[MAXSIZE-i]='\0';去掉,那么在显示后面就会出现乱码现象。
-------------------------------
[armlinux@lqm test-read]$ ./write
Open file:hello.c 3
Write:Hello!I`m writing to this file!
Now test starts...
string-len=31,count=31,size=31
read from file:Hello!I`m writing to this file?B
B
linux如何拿到文件的返回值,linux 下read函数返回值分析相关推荐
- (14年)2.写一个函数int func(int n)其返回值是n的逆序整数,例如n=123函数返回321.n=72839,函数返回93827
#include <stdio.h> #include <stdlib.h> /*写一个函数int func(int n)其返回值是n的逆序整数 例如n=123.函数返回321 ...
- mysql 取一行_MySql – 如何获取上一行中的值和下一行中的值?
id(int 11) //not autoincriment value (varchar 100) 它有以下几行数据: 0 100 2 150 3 200 6 250 7 300 请注意,id值不是 ...
- linux获取命令的返回值,Shell $?:获取函数返回值或者上一个命令的退出状态
$?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...
- linux 遍历目录查找文件find太慢,Linux下比find快N倍的文件查找命令
使用linux操作系统的人,一般都用过文件查找命令find,在文件数量非常庞大的时候,比如在高通的android工程项目中,目录大小有十几个G,文件数量非常多,用find命令就太慢了. 下面介绍一个比 ...
- linux命令删除的文件怎么找回来,linux误删文件怎么恢复 linux误删命令行文件怎么恢复...
linux误删文件怎么恢复 linux误删命令行文件怎么恢复 linux系统是不同于windows系统和mac系统的,它独特的系统操作深受广大网友喜爱.有的朋友在使用linux系统的时候,不小心把一些 ...
- php7 返回值,7.6.4 函数返回值
### 7.6.4 函数返回值 调用内部函数时其返回值指针作为参数传入,这个参数为`zval *return_value`,如果函数有返回值直接设置此指针即可,需要特别注意的是设置返回值时需要增加其引 ...
- linux php不能写文件内容,php 在linux系统下写出文件问题
最近写了一个简单的生成文件,服务器用的linux 但是在将文件写出到路径的时候就会写出一个其他的文件夹 其中一些代码如下 define("paddy",dirname(__FILE ...
- python return返回值_Python return语句 函数返回值
return语句是从python 函数返回一个值,在讲到定义函数的时候有讲过,每个函数都要有一个返回值.Python中的return语句有什么作用,今天就来仔细的讲解一下. python 函数返回值 ...
- linux拷贝到新建文件夹命令行,Linux创建文件touch,复制文件cp,tab补全,链接文件ln命令...
一.创建文件 使用touch 可以创建空文件,例如opt目录下创建test2.txt文件.这种一般是有些程序必须要先创建文件,才能使用. 二. 复制文件 2.1 使用cp命令来复制文件,需要两个参数- ...
最新文章
- 深度学习核心技术精讲100篇(十九)--GBDT(梯度提升树) 和 Resnet (残差网络)的原理
- 多线程:interrupted、isinterrupted区别
- python异常处理_汇总三大python异常处理、自定义异常、断言原理与用法分析
- 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
- LIBCLNTSH.SO: WRONG ELF CLASS: ELFCLASS32错误一例
- 把tomcat默认的8080段口改成80端口
- 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案
- Firefox 不响应 event.keyCode 问题的解决方案
- linux中split函数用法,Linux split命令参数及使用方法详解
- 单字节字符集,多字节字符集,Unicode
- centos虚拟机克隆
- printf格式控制符的完整格式(转载)
- 142.PHP session 阻塞问题
- mysql bit 设置默认值_为什么数据库字段需要设置默认值
- jmeter测试mysql数据库_【JMeter】JMeter完成一个MySql压力测试
- android大智慧安装目录,大智慧文件目录
- java借助Acrobat实现pdf转word
- 每日英语Daily English
- 《科学管理原理》读后感
- 基本乐理知识——和弦
热门文章
- win32 API &winsock c++架构实现仿QQ聊天室
- 9月Libra开发人员更新-路线图#1
- 解析C语言结构体及位段
- C++:计算对称正定 (SPD) 矩阵的逆矩阵(附完整源码)
- 苹果 macOS Big Sur 11.5.1(20G80)正式版发布
- 【推荐系统】评估指标总结
- 西南交通大学计算机考研调剂的多吗,2020年西南交通大学考研调剂公告
- Occluded-REID 行人重识别中的遮挡数据集
- 淘宝订单API获取订单代码说明
- 概念结构设计、逻辑结构设计、物理设计的区分