1,fread是带缓冲的,read不带缓冲.

2,fopen是标准c里定义的,open是POSIX中定义的.

3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.

4,fopen不能指定要创建文件的权限.open可以指定权限.

5,fopen返回指针,open返回文件描述符(整数).

6,linux/unix中任何设备都是文件,都可以用open,read.

如果文件的大小是8k。

你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。

如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。

也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。

如果程序对内存有限制,则用read/write比较好。

都用fread 和fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,用read 和write,如套接口,管道之类的

系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下。而fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。

如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。

 

出自:http://www.linuxdiyf.com/viewarticle.php?id=111369

 

linux read函数

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=0;i<total_read_bytes;i++)

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yylklshmyt20090217/archive/2009/11/13/4807390.aspx

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐