开发者学堂课程【物联网开发- 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就是从文件中写。