不带缓存的文件I/O操作,主要用到6个函数--creat,open,read,write,lseek,close.
这里的不带缓存是指每一个函数都只调用系统中的函数,这些函数虽然不是ANSI C
的组成部分,但却是POSIX的组成部分。
下面就来介绍一下这几个函数:
1.creat:
函数的作用:
创建文件;
函数原型:
int creat(const char *pathname, mode_t mode);
函数参数:
Pathname:要建立的文件路径字符串(使用时要加双引号);
Mode: 建立文件的权限;
函数返回值:
Int型.
成功返回文件描述符,
出错返回 -1;
函数头文件:
#include
#include
#include
2.Open
函数作用:
打开或者创建文件。
函数原型:
int open (const char *pathname, int flags);
Int open (const char *pathname,int flags, mode_t mode);
函数参数:
flags:使用的标志;例如:
O_RDONLY 只读;
O_WRONLY 只写;。。。。。。
返回值:
Int 型;
成功返回文件描述符;
失败返回 -1;
头文件:(同上);
3.Read
函数作用:
从打开的文件中读取数据
函数原型:
Ssize_t read(int fd, void *buf, size_t count);
函数参数:
Fd:open返回的文件描述符。
Buf:放置都出来的数据缓冲区。
Count:要读取的字符数。
返回值:
Ssize_t (自己重命名的类型,一般为int型);
成功返回读到的字符数(字节)
出错返回-1;
头文件:
#include
4.Write
函数作用:
将数据写入已经打开的文件内。
函数原型:
Ssize_t write(int fd, const void *buf, size_t count);
函数参数:
Count:写入的字节数。
返回值:
Int 型;
成功返回实际写入的字节数。
失败返回 -1.
5.lseek
函数作用:移动函数指针到指定位置。
函数原型:off_t lseek(int fd, off_t offset, int whence);
函数参数:
fd:文件描述符。
Whence:文件的指针位置。例如:
SEEK_SET 文件头
SEEK_CUR 文件的当前位置
SEEK_END 文件尾
offset:文件指针偏移量,向前移动是负数,向后是正数。
返回值:
Int 型.
返回文件指针到文件头的字节数。
最后需要注意的是:当我们write函数写入数据时,文件指针指向了写入的数据尾,这时如果还用read来读取数据,是从文件指针指的地方开始读,是无法读到数据的,所以要用lseek函数把指针指向文件头。(lseek(fd,0,SEEK_SET));
例如复制一个文件到另一个文件:
程序:
#include
#include
#include
#include
#include
#define MAX_SIZE 1024
int main(int argc, char *argv[])
{
int from_fd,to_fd;
int from_read,to_write;
char buf[MAX_SIZE];
char *ptr;
if(argc != 3)
{
printf("Please choose 2 file!\n");
exit (1);
}
from_fd = open(argv[1],O_RDONLY);
if(from_fd == -1)
{
printf("can not open file1 !\n");
exit (1);
}
to_fd = open(argv[2],O_WRONLY | O_CREAT,S_IRUSR | S_IWUSR);
if(to_fd == -1)
{
printf("can not open file2 !\n");
exit (1);
}
while(from_read = (from_fd,buf,MAX_SIZE))
{
if(from_read == -1)
{
break;
}
else if(from_read > 0)
{
ptr = buf;
while(to_write = write(to_fd,ptr,from_read))
{
if(to_write == -1)
{
break;
}
else if(to_write == from_read)
{
break;
}
else if(to_write > 0)
{
ptr+=to_write;
from_read-=to_write;
}
}
if(to_write == -1)
{
break;
}
}
}
close(from_fd);
close(to_fd);
exit(0);
}