都需要包含头文件:
<unistd.h>
read系统函数从打开的设备或文件中读取数据,即将数据从外设上经过内核读到用户空间;write系统函数相反,向打开的设备或文件中写入数据,即将数据从用户空间(I/O缓冲)送到内核,然后刷到外设上。它们的函数原型如下:
ssize_t read(int fd, void *buf, size_t count);
ssize_t
为有符号整型,
size_t
为无符号整型。
fd为相应的文件描述符;buf为用户给定的数据缓冲区,该缓冲不是固定大小的,由count值决定其大小(用户给定,字节数)。如 read( fd , “hello” , 5 ); 此时的void *buf为char *类型。即count为请求读取的字节数(即buf的大小)。该函数的返回值为-1时,表示读取数据失败;返回值>0时,表示读出的字节数;返回值等于0时,表示已经读完了,因此没有数据可读了。
ssize_t write(int fd, const void *buf, size_t count);
buf为需要输出的缓冲区,由用户给定。cout为最大输出字节数(buf的大小,字节数)。返回值为-1时,表示写入失败;>=0时,表示写入的字节数。
以上两个缓冲区buf都是用户空间的地址,但是与I/O缓冲区不一样,后者是规定的,前者是用户自己指定的。
思考:利用
read
、
write
每次读或写
1
个
Byte
与利用
gets
和
puts
每次读或写
1
个
Byte
哪一种方式速度更快
?
read和write函数为Linux系统函数,其缓冲区由用户来维护,即用户指定其大小,从而每次要将用户空间的数据送到内核或从内核送到用户空间的数据大小是由用户来规定的(count);而gets和puts为C库函数,其I/O缓冲区由库函数自己维护,大小为8Byte,因此平均上,每传送8个Byte的数据量才会操作一次内核。综上,以上两者在读写数据时,显然read、write函数每次从用户空间读1Byte数据是就会操作一次内核(系统调用)(,开销更大,速度会更慢。而puts和gets函数速度更快。 当然,用户可以指定read和write的count参数,来增大其缓冲区大小,从而提高其读写速度,使其比puts和gets更快(对大文件来说,效果更加明显)。
下面举例说明read和write的用法:
//
将一个文件(
english.txt
)的内容读到另一个文件(
writefile.txt
)
[root@localhost work]# vim rdwr.c
[root@localhost work]# ls
english.txt rdwr.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main( )
int fd;
fd = open("english.txt",O_RDONLY); //以只读方式打开
printf("open readfile's fd=%d\n",fd);
if( fd == -1 )
perror(" open english.txt " );
exit(1);
int fd1;
char buff[1024] = { 0 }; //定义一个缓冲区
fd1 = read( fd,buff,sizeof(buff) ); //将数据读出到缓冲区
printf("read readfile's fd1=%d\n",fd1);
if( fd1 == -1 )
perror(" read english.txt " );
exit(1);
int fd2;
fd2 = open( "writefile.txt" ,O_WRONLY | O_CREAT | O_EXCL,0664); //创建一个写文件,并以只写的方式打开,如果文件创建的文件存在,则结束
printf("open writefile's fd2=%d\n",fd2);
if ( fd2 == -1 )
perror( "creat file" );
exit(1);
int ret;
while( fd1 )
ret = write( fd2,buff,fd1); //将读出的数据写进另一个新文件
if( ret == -1 )
perror( "write file");
exit(1);
fd1 = read( fd,buff,1024); //再次读数据到缓冲区
if( fd1 == -1 )
perror(" read english.txt " );
exit(1);
int qw1;
int qw2;
qw1=close(fd); //关闭文件
if( ret == -1 )
perror( "close readfile");
exit(1);
qw2=close(fd2);
if( ret == -1 )
perror( "close writefile");
exit(1);
return 0;
[root@localhost work]# gcc -pipe -pedantic -Wall -ggdb3 rdwr.c -o rdwr
[root@localhost work]# ./rdwr
open readfile's fd=3
read readfile's fd1=1024
open writefile's fd2=4
[root@localhost work]# ls
english.txt rdwr rdwr.c writefile.txt
[root@localhost work]# ll writefile.txt
-rwxrwxrwx. 1 root root 109055 Mar 19 11:39 writefile.txt
[root@localhost work]# ll english.txt
-rwxrwxrwx. 1 root root 109055 Mar 19 10:30 english.txt //两文件大小一样
都需要包含头文件: <unistd.h>read系统函数从打开的设备或文件中读取数据,即将数据从外设上经过内核读到用户空间;write系统函数相反,向打开的设备或文件中写入数据,即将数据从用户空间(I/O缓冲)送到内核,然后刷到外设上。它们的函数原型如下:ssize_t read(int fd, void *buf, size_t count); ssize_t为有符号...
1、文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或create返回的文件描述符表示该文件,将其作为参数传给read或write函数。
2、write函数
write函数定义如下:
#include
ssize_t write(int filedes, void *buf, size_t nbytes);
// 返回:若成功则返回写入的字节数,若出错则返回-1
// filedes:文件描述
在使用涉及到系统调用的编程中,操作的文件描述符诸如管道之类的,获设备节点之类的(比如串口,USB口中讲usb作为camera的),涉及到内核态和用户态的数据读写,这时候经常遇到读写达不到
理想,本文编写方式先列出问题点,后面给出对应的解决方案。该文章主要针对系统调用注意事项,未完待续…在串口编程中, 即使使用方式获取到内核态有数据可读,也可能无法满足你想的结果。比如算出需要读10个字节(理论按照私有协议有10字节才是一个完整包),有一定概率出现读小于10个字节的数据, 原因为因此针对该问题使用如下替代方案:
两个函数是对文件进行读写操作,使用时需要包含unistd.h,函数格式如下:
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
fd:目标文件
buf:内存的缓冲区
count:期望写入、读取的字节数
成功写入的时候会返回实际写入的字节数,失败返回-1。
实例代码如下:
1.write的用法:
#incl...
1.文件描述符 文件描述符(file descriptor)通常是一个小的非负整数,内核用以 标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一 个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这 个文件描述符。
2.标准输入、标准输出和标准错误 按惯例,每当运行一个新程序时,所有的 shell 都为其打开 3 个文 件描述符,即标准输入(standard ...
一、read函数
read函数从打开的设备或文件中读取数据。#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前
java有关文件传输的read以及write方法——丑九怪
涉及处理文件的操作,简单说一下read方法和write方法,简单的不提了,相信大家在使用的时候,会碰到两个三参的方法,至于用法,且听我娓娓道来
read(byte[] b, int off, int len);
用来从调用他的stream处,向缓冲区写数据
第一个参数 : 很明显,这是一个buffer,一个缓冲区
第二个参数 :这里可...
- fd:文件描述符,指向需要定位的文件。
- offset:偏移量,可以为正数或负数。
- whence:偏移起始位置,可以取值为SEEK_SET、SEEK_CUR或SEEK_END,分别表示从文件开头、从当前位置、从文件末尾开始计算偏移量。
lseek函数返回值为off_t类型,表示文件指针的新位置。当返回值为-1时,表示定位出错。