原文出处: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函数返回值分析相关推荐

  1. (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 ...

  2. mysql 取一行_MySql – 如何获取上一行中的值和下一行中的值?

    id(int 11) //not autoincriment value (varchar 100) 它有以下几行数据: 0 100 2 150 3 200 6 250 7 300 请注意,id值不是 ...

  3. linux获取命令的返回值,Shell $?:获取函数返回值或者上一个命令的退出状态

    $?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...

  4. linux 遍历目录查找文件find太慢,Linux下比find快N倍的文件查找命令

    使用linux操作系统的人,一般都用过文件查找命令find,在文件数量非常庞大的时候,比如在高通的android工程项目中,目录大小有十几个G,文件数量非常多,用find命令就太慢了. 下面介绍一个比 ...

  5. linux命令删除的文件怎么找回来,linux误删文件怎么恢复 linux误删命令行文件怎么恢复...

    linux误删文件怎么恢复 linux误删命令行文件怎么恢复 linux系统是不同于windows系统和mac系统的,它独特的系统操作深受广大网友喜爱.有的朋友在使用linux系统的时候,不小心把一些 ...

  6. php7 返回值,7.6.4 函数返回值

    ### 7.6.4 函数返回值 调用内部函数时其返回值指针作为参数传入,这个参数为`zval *return_value`,如果函数有返回值直接设置此指针即可,需要特别注意的是设置返回值时需要增加其引 ...

  7. linux php不能写文件内容,php 在linux系统下写出文件问题

    最近写了一个简单的生成文件,服务器用的linux 但是在将文件写出到路径的时候就会写出一个其他的文件夹 其中一些代码如下 define("paddy",dirname(__FILE ...

  8. python return返回值_Python return语句 函数返回值

    return语句是从python 函数返回一个值,在讲到定义函数的时候有讲过,每个函数都要有一个返回值.Python中的return语句有什么作用,今天就来仔细的讲解一下. python 函数返回值 ...

  9. linux拷贝到新建文件夹命令行,Linux创建文件touch,复制文件cp,tab补全,链接文件ln命令...

    一.创建文件 使用touch 可以创建空文件,例如opt目录下创建test2.txt文件.这种一般是有些程序必须要先创建文件,才能使用. 二. 复制文件 2.1 使用cp命令来复制文件,需要两个参数- ...

最新文章

  1. 深度学习核心技术精讲100篇(十九)--GBDT(梯度提升树) 和 Resnet (残差网络)的原理
  2. 多线程:interrupted、isinterrupted区别
  3. python异常处理_汇总三大python异常处理、自定义异常、断言原理与用法分析
  4. 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
  5. LIBCLNTSH.SO: WRONG ELF CLASS: ELFCLASS32错误一例
  6. 把tomcat默认的8080段口改成80端口
  7. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案
  8. Firefox 不响应 event.keyCode 问题的解决方案
  9. linux中split函数用法,Linux split命令参数及使用方法详解
  10. 单字节字符集,多字节字符集,Unicode
  11. centos虚拟机克隆
  12. printf格式控制符的完整格式(转载)
  13. 142.PHP session 阻塞问题
  14. mysql bit 设置默认值_为什么数据库字段需要设置默认值
  15. jmeter测试mysql数据库_【JMeter】JMeter完成一个MySql压力测试
  16. android大智慧安装目录,大智慧文件目录
  17. java借助Acrobat实现pdf转word
  18. 每日英语Daily English
  19. 《科学管理原理》读后感
  20. 基本乐理知识——和弦

热门文章

  1. win32 API &winsock c++架构实现仿QQ聊天室
  2. 9月Libra开发人员更新-路线图#1
  3. 解析C语言结构体及位段
  4. C++:计算对称正定 (SPD) 矩阵的逆矩阵(附完整源码)
  5. 苹果 macOS Big Sur 11.5.1(20G80)正式版发布
  6. 【推荐系统】评估指标总结
  7. 西南交通大学计算机考研调剂的多吗,2020年西南交通大学考研调剂公告
  8. Occluded-REID 行人重识别中的遮挡数据集
  9. 淘宝订单API获取订单代码说明
  10. 概念结构设计、逻辑结构设计、物理设计的区分