在linux中用read,怎么知道是否读到数据的末尾??以及怎么知道是否读到文件的末尾??谢谢!!!

在linux中用read,怎么知道是否读到数据的末尾??以及怎么知道是否读到文件的末尾??谢谢!!!,第1张

你的这个串口设备在打开(也就是调用open函数获取设备描述符)的时候设置的是非阻塞方式。导致串口上没数据的时候read也立即返回,但是你的while已经把有效的数据读走了,if里面读到的一定是空的,所以什么也不打印。

建议

1. 在打开串口设备时使用阻塞方式,不会设置的话查查open系统调用的帮助,它有个flag;

2. 把while循环内的if语句去掉。

open系统调用

open函数的三个参数:

(1)path是已经存在的文件的路径;

(2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;

若值为 O_WDONLY,就以只写方式打开文件;

若值为 O_RDWR,就以读写方式打开文件;

(3)参数mode:文件的权限,对于一个已经存在的文件,参数mode是没有用的,通常将其省略,因此这种情况下open调用只需两个参数。

创建新文件:

前面已经说到,当文件不存在时,open会创建一个新文件(仅能是普通文件),我们只需要用 or *** 作向open的 oflags参数中加入标志O_CREAT即可。这样可以创建一个新的只读文件,但是这没有任何意义,因为所创建的新文件没有任何可读内容。因此一般需要 O_CREAT与 O_WRONLY或 O_RDWR一起使用,此时就需要mode参数了。

例如:

int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE)

参数mode仅在创建新文件时有效,对于一个已经存在的文件,它没有任何作用。

关于open的flags参数:

除了以上介绍的 open标志外,open还有许多标志,具体的如下表所示:

标志

解释

O_RDONLY

只读方式打开

O_WRONLY

只写方式打开

O_RDWR

读写方式打开

O_APPEND

每次写都追加到文件的尾端

O_CREAT

若文件不存在则创建文件

O_DSYNC

设置同步I/O方式

O_EXCL

如果文件已存在,则出错;必须与O_CREAT一起使用

O_NOCTTY

不将此设备作为控制终端

O_NONBLOCK

不等待命名管道或特殊文件准备好

O_RSYNC

设置同步I/O方式

O_SYNC

设置同步I/O方式

O_TRUNC

将其长度截短为0

write系统调用

write函数的三个参数:

(1)fildes: 文件描述符

(2)buf:指定写入数据的数据缓冲区

(3)nbytes:指定写入的字节数

函数返回值:

成功:已写的字节数

-1 :出错

0:未写入任何数据

例子:

运行结果:

read系统调用

read函数的三个参数:

(1)fildes:文件描述符

(2)buf:指定读入数据的数据缓冲区

(3)nbytes:指定读入的字节数

函数返回值:

成功:已读的字节数

0:未读入任何数据

-1:出错

例子:

运行结果:

close系统调用

通过对 close进行分析,我们会发现close并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。

read函数(读取文件)

read函数可以读取文件。读取文件指从某一个已打开地文件中,读取一定数量地字符,然后将这些读取的字符放入某一个预存的缓冲区内,供以后使用。

使用格式如下:

number = read( ...

read函数(读取文件)

read函数可以读取文件。读取文件指从某一个已打开地文件中,读取一定数量地字符,然后将这些读取的字符放入某一个预存的缓冲区内,供以后使用。

使用格式如下:

number = read(handle, buffer ,n) ;

上述read调用函数中,各个参数的定义如下:

handle: 这是一个已经打开的文件句柄,表示从这个文件句柄所代表的文件读取数据。

buffer: 指缓冲区,即读取的数据会被放到这个缓冲区中去。

n: 表示调用一次read *** 作,应该读多少数量的字符。

number:表示系统实际所读取的字符数量。

假设某个文件的长度是600字符,而n的值是512,则在第1次调用读这个文件时,系统可以正常地读取512个字符地内容,并将这些字符数量传给number变量,因此number的值将变为88。要第2次读取这个文件时,因为文件已经没有内容可供读取了,此时系统会返回0给number。另外,如果读取文件失败,系统将返回-1给number。

比如一个有100个字节的文件,第一次读取10个字节,这时读取指针在第10个字节处。再次进行10个字节的读 *** 作时,会接着第一次读的位置接着往后读。如果还想从开始读,可使用lseek函数定位。

Code:

#include "lyl.h"

#define BUF 512

main()

{

static char filename[]="t1.txt"

char buffer[BUF]

int handle

int i

int total = 0

handle = open(filename,O_RDONLY)

if ( handle == -1 )

{

printf("[%s] create fail !!!!

",filename)

exit(1)

}

else

{

while( (i = read(handle,buffer,BUF) ) >0 )

total =i

}

printf("The total character in 《%s》 is %d

",filename,total )

exit(0)

}

程序执行结果:

The total character in 《t1.txt》 is 11

$cat t1.txt

1234567890

【 read系统调用】

功能描述:

从文件读取数据。

用法:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count)

参数:

fd: 将要读取数据的文件描述词。

buf: 所读取到的数据的内存缓冲。

count: 需要读取的数据量。

返回说明:

成功执行时,返回所读取的数据量。失败返回-1,errno被设为以下的某个值

EAGAIN:打开文件时设定了O_NONBLOCK标志,并且当前没有数据可读取

EBADF:文件描述词无效,或者文件不可读

EFAULT:参数buf指向的空间不可访问

EINTR:数据读取前, *** 作被信号中断

EINVAL:一个或者多个参数无效

EIO:读写出错

EISDIR:参数fd索引的时目录

备注:

从串口读数据,只读一次,数据没有读全。加入while后,则数据读全了。

total_read_bytes=0

while(read_bytes=read(fd_485,buffer1,256)>0)

{

memcpy(buffer2+total_read_bytes,buffer1,read_bytes)

total_read_bytes+=read_bytes

}

for(i=0i<total_read_bytesi++)

printf("0x%02lx\n",buffer2[i])


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7616295.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-07
下一篇2023-04-07

发表评论

登录后才能评论

评论列表(0条)

    保存