read 函数|学习笔记

简介: 快速学习 read 函数

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频read 函数】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/10977


read 函数

 

内容介绍

一、 read 函数

二、 验证 read

 

一、read 函数

1.简介

read函数的参数第一个是fd,第二个是指针,第三个是count,和write函数的参数是一样的,返回值也是size_t就是整形的,这个函数的功能是从文件中读取东西放到内存中,从fd所代表的文件中读取东西,希望读count个字节,保存到addr指向的内存里面,返回值是一个size_t,成功返回实际读取到的字节个数,失败返回-1

把指定数目的数据读到内存

# include ( unistd , h >

ssize _ t read ( int fd , void * addr , size _ t count ):

参数:

fd :文件描述符。

addr :内存首地址。

count :读取的字节个数。

返回值:

成功返回实际读取到的字节个数。

失败返回﹣1,可以利用 perror 去查看原因。

2.从文件中读取东西代码

要存到内存中要么定义数组要么申请空间,这里定义数组,读的时候读99个,open 以只读的方式打开这个文件,得到一个fd文件描述符,fd代表了当前目录下的test.TXT,判断一下是否失败,接下来调用 read,read代表从fd所代表的文件test.TXT中读东西,最多想读99个字节,保存到 char str[100]数组中,然后给 count 赋值,如果count 等于负一是出错否则就成功,如果err不等于就零就失败了判断打印出错信息。整个程序就是打开,读99个保存到数组中,最好先做 memset,将str指向的内存全部变成零,一百个字节都是零,最多读99不一定读到99,看文件当中的字节数

int fd ;

int count ; int err ;

char * path ="./ test . txt "; char str [100];

fd = open ( path ,O_ RDONLY );

if ( fd ==-1)

perror (" open ");

return 0;

memset ( str ,0,);

count = read ( fd , str ,99);

if ( count ==-1)

perror (" read ");

return 0;

err = close ( fd );

if ( err !=0)

perror (" close ");

return 0;

 

二.验证 read

1.代码

将代码放入 main 函数中,运行一下查看效果

首先要包含同文件,系统调用都是要包含最后一个,最后一个同文件必须包含。

在写一个 main 函数,在 main 函数当中放入此代码,第一件事是打开当前目录下test.txt,以只读的方式打开,接下来从文件当中读取东西放在 str 当中,读完之后关闭文件程序结束。

# include く stdio . h >

# include く sys / stat . h >

# include く sys / types . h >

# include < fcntl . h >

# include < unistd . h >

int main ()

int fd ;

int count ; int err ;

char * path ="./ test . txt "; char str [100];

fd = open ( path ,O_ RDONLY );

if ( fd ==-1)

perror (" open ");

return 0;

memset ( str ,0,);

count = read ( fd , str ,99);

if ( count ==-1)

perror (" read ");

return 0;

err = close ( fd );

if ( err !=0)

perror (" close ");

return 0;

格式转为UTF8无BOM格式,因为打开文件时没有创建文件,所以这个文件要一定存在,如果不存在open就会出错,

运行查看结果

[03_ day ] vi / usr / include /i386-linux- gnu / asm / unistd _32.h

[03_ day ] cd .·

[ share ] Ls

01_ day 02_ day 03_ day hello . c syscalls share ] cd syscalls /

[ syscalls ] Ls

01_ day

[ syscalls ] cd 01_ day /

[01_ day ] Ls

read . C

[01_ day ] gcc read . c -0 read

read . c :在函数‘ main ’中:

read . c :19:2:

警告:隐式声明与内建函数 memset ’不兼容[默认启用]

[01_ day ]

memset没有包含同文件

修改代码

memset需要string.h同文件,

# include く stdio . h >

# include く sys / stat . h >

# include く sys / types . h >

# include < fcntl . h >

# include < string . h >

# include < unistd . h >

int main ()

int fd ;

int count ; int err ;

char * path ="./ test . txt "; char str [100];

fd = open ( path ,O_ RDONLY );

if ( fd ==-1)

perror (" open ");

return 0;

memset ( str ,0,);

count = read ( fd , str ,99);

if ( count ==-1)

perror (" read ");

return 0;

err = close ( fd );

if ( err !=0)

perror (" close ");

return 0;

修改后运行

当前目录下没有test.txt,去运行一下read看看,open是出错,先打了一个open,传给perror的那个东西,后面跟着出错信息no such file or directory,没有这个文件或目录

[01_ day ] ls read read . c

[01_ day ]./ read

open : No such file or directory

[01_ day ]

接下来需要有一个test.txt里面放一些东西,这样就有了test.txt,运行程序将文件中的东西读取过来,继续修改,read成功之后要打印读出来的东西

# include く stdio . h >

# include く sys / stat . h >

# include く sys / types . h >

# include < fcntl . h >

# include < string . h >

# include < unistd . h >

int main ()

int fd ;

int count ; int err ;

char * path ="./ test . txt "; char str [100];

fd = open ( path ,O_ RDONLY );

if ( fd ==-1)

perror (" open ");

return 0;

memset ( str ,0,);

count = read ( fd , str ,99);

if ( count ==-1)

perror (" read ");

return 0;

printf (" str =% s\n ", str );

err = close ( fd );

if ( err !=0)

perror (" close ");

return 0;

[01_ day ] Ls

read read . c test . txt

[01_ day ]./ read

str = jlkfdsasd

lkdsafjLkasjdfLka alkdsfjlka

LdsafjlkasdjflkajsdfLkas hello kitty

[01_ day ]

读取成功了,最多想读99个字节在打内容之前先打一下count看读出来多少个

# include く stdio . h >

# include く sys / stat . h >

# include く sys / types . h >

# include < fcntl . h >

# include < string . h >

# include < unistd . h >

int main ()

int fd ;

int count ; int err ;

char * path ="./ test . txt "; char str [100];

fd = open ( path ,O_ RDONLY );

if ( fd ==-1)

perror (" open ");

return 0;

memset ( str ,0,);

count = read ( fd , str ,99);

if ( count ==-1)

perror (" read ");

return 0;

printf (" str =% s\n ", str );

printf (" count =% d \ n ", count );

err = close ( fd );

if ( err !=0)

perror (" close ");

return 0;

[01_ day ] gcc read . c - o read

[01_ day ]./ read

count =76

str = jlkfdsasd

lkdsafjlkasjdflka alkdsfjlka

Ldsafjlkasdjflkajsdflkas helLo kitty

[01_ day ]

再次运行,想要读99结果只读了76,因为文件中只有这么多东西

read会用了就是从文件中读取东西write就是从文件中写。

相关文章
|
4月前
|
Linux C语言 Python
perf_event_open 学习 —— 通过read的方式读取硬件技术器
perf_event_open 学习 —— 通过read的方式读取硬件技术器
|
存储 缓存
【什么是Read Write Through机制】
【什么是Read Write Through机制】
180 0
Linux操作方法集接口(read,write)
Linux操作方法集接口(read,write)
Linux操作方法集接口(read,write)
|
分布式计算 Java 大数据
DataFrame 介绍_创建_read | 学习笔记
快速学习 DataFrame 介绍_创建_read
219 0
DataFrame 介绍_创建_read | 学习笔记
|
机器学习/深度学习 物联网 Linux
Write 带阻塞|学习笔记
快速学习 Write 带阻塞
|
物联网 Linux 开发者
Write 函数|学习笔记
快速学习 Write 函数
|
C# 索引
艾伟:浅谈 Stream.Read 方法
Microsoft .NET Framework Base Class Library 中的 Stream.Read 方法: Stream.Read 方法 当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数。
1156 0