不带缓存的文件操作用到的几个的函数

不带缓存的文件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);
}

你可能感兴趣的:(不带缓存的文件操作用到的几个的函数)