fopen与open的区别
fopen可移植,open不能,fopen在用户态下就有了缓存,在进行read和write的时候减少了用户态和内核态的切换,而open则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列快;如果随机访问文件open要比fopen快。前者属于低级IO,后者是高级IO。前者返回一个文件描述符(用户程序区的),后者返回一个文件指针。前者无缓冲,后者有缓冲。前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
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