read 函数
-#include <unistd.h>
-ssize_t read(int fd, void *buf, size_t count);
从fd 所指的文件中读取count 个字节到buf 中。返回实际读取到的字节数,有错误发生则返回-1。读取文件时,文件读写指针会会随着读取到的字节数移动。
write 函数
- #include <unistd.h>
- ssize_t write(int fd, const void *buf, size_t count);
把buf中的count个字节写入fd 所指的文件中, 返回实际写入的字节数,有错误发生则返回-1。写入文件时,文件读写指针会随着写入的字节数移动。
lseek 函数:控制文件指针的位置
-#include <sys/types.h>
-#include <unistd.h>
-off_t lseek(int fd, off_t offset, int whence);
offset 根据whence 来移动文件指针的位移数
whence 取值 :
取值 |
含义 |
SEEK_SET |
从文件开始处向后移动 offset |
SEEK_CUR |
从文件指针当前位置处向后移动 offset,负数时向前移动offset |
SEEK_END |
从文件结尾处向后移动 offset,负数时向前移动offset |
成功返回当前的读写位置,也就是距离文件开始处多少个字节,错误返回-1
常用操作:
用法 |
含义 |
lseek( int fd , 0,SEEK_SET) |
移动到文件开头 |
lseek(int fd, 0, SEEK_END) |
移动到文件结尾i |
lseek(int fd, 0, SEEK_CUR) |
获取当前位置(相对于文件开头的偏移量) |
实例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
void my_err(const char *err_string ,int line )
{
fprintf(stderr,"line:%d " ,line) ;
perror(err_string) ;
exit(1) ;
}
int my_read(int fd)
{
int len ;
int ret ;
int i ;
char read_buf[64] ;
if((lseek( fd , 0 ,SEEK_END))== -1)
my_err("lseek",__LINE__) ;
if((len=lseek(fd,0,SEEK_CUR)) == -1 )
my_err("lseek",__LINE__) ;
if((lseek(fd,0,SEEK_SET)) == -1 )
my_err("lseek",__LINE__) ;
printf(" 字节数是 : %d \n",len) ;
if((ret = read(fd,read_buf,len)) < 0)
my_err("read",__LINE__ ) ;
for(i= 0 ;i< len ;i++)
printf("%c",read_buf[i]) ;
printf("\n") ;
return ret ;
}
int main(void)
{
int fd ;
char write_buf[32]="Hello Word !!" ;
if((fd =open("example_63.c",O_RDWR | O_CREAT |O_TRUNC ,S_IRWXU))== -1)
my_err("open",__LINE__) ;
else{
printf("Creat file success !!\n") ;
}
if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) )
my_err("write",__LINE__) ;
my_read(fd) ;
printf("/*--------------------------------------------*/\n") ;
if(lseek(fd,10,SEEK_END)== -1)
my_err("lseek",__LINE__) ;
if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) )
my_err("write",__LINE__) ;
my_read(fd) ;
close(fd) ;
return 0;
}
lseek 允许文件指针移到EOF之后,会以\0 填充,但不会改变文件大小。
预编译器内置宏有:
__LINE__ 行数
__TIME__ 时间
__FUNCTION__ 函数
__FINE__ 文件名
下一篇介绍关于文件锁的那些事.