您的位置:首页 > 运维架构 > Linux

linux文件的输入输出

2015-10-14 14:56 567 查看
文件的输入输出

Linux函数:creat、open、close、read、write和lseek等

C语言:fopen、fclose、fread、fwrite、fseek等

在编写跨平台程序时,最好使用C语言的标准库函数以方便移植,因为creat、open等系统函数使用文件描述符来标识文件,而文件描述符是UNIX/Linux特有的,不方便移植。

 

1.    open函数

打开创建一个文件

Int open(const char *pathname, int flags);

Int open(const char *pathname, int flags,mode_t mode);

Pathname:要打开或创建的含路径的文件名

Flags:打开文件的方式

O_RDONLY:只读方式打开

O_WRONLY:只写方式打开

O_RDWR:可读可写方式打开

O_CREAT:文件不存在则自动创建,只有在此时才需要用到第三个参数mode,以说明新文件的存取权限

O_EXEC:检查文件是否存在,文件若不存在则创建该文件,若文件已存在则将导致打开文件出错。

O_TRUNC:若文件存在并且以可读可写方式打开,此标志会将文件长度清为0,即原文件中保存的数据将丢失,但文件的属性不变。

O_APPEND:所写入的数据会议追加的方式加入到文件后面

O_NONBLOCK或O_NDELAY:以阻塞方式打开文件

只有当第二个参数使用了O_CREAT时,才需要使用第三个参数,以说明新文件的存取权限。新文件的实际存取权限是mode与umask按照(mode&~umask)运算以后的结果。

返回值:

成功:返回一个文件描述符

错误:-1

 

2.    create函数

文件创建

Int create(const char *pathname, mode_t mode)

Pathname:打开或创建的文件名,如果pathname指向的文件不存在,则创建一个新文件。如果pathname指向的文件存在。则源文件被新文件覆盖。

Mode:与open函数mode相同

返回值:

成功:返回一个文件描述符

错误:-1

 

3.    close函数

关闭一个已经打开的文件

int close(int fd);

返回值:

成功:0

错误:-1

 

4.    read函数

从打开的文件中读取数据

Ssize_t read(int fd, void *buf, size_t count)

含义:从文件描述符fd所指向的文件中读取count个字节的数据到buf所指向的缓存中。文件读写指针会随着读取到的字节移动。

建议:如果read()顺利返回实际读到的字节数,最好将返回值与参数count作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾或者read()被信号中断了读取过程,或其它原因。

返回值:

成功:实际读取字节数

错误:-1

 

5.    write函数

将数据写入已打开的文件

Ssize_t write(int fd, const void *buf, size_tcount);

含义:将buf所指向的缓冲区中的count个字节数据写入到由文件描述符fd所指向的文件中。

返回值:

成功:返回写入的字节数

错误:-1

 

6.    lseek函数

移动文件读写指针的位置

Off_t lseek(int fields, off_t offset, intwhence);

Fields:打开的文件描述符

Offset:为根据参数whence来移动读写位置的位移数

Whence:SEEK_SET文件开始处

SEEK_CUR:当前位置

SEEK_END:文件结尾

返回值:

成功:返回当前的读写位置,也就是距离文件开始处多少个字节

错误:-1

Lseek几种常用方法

将文件读写指针移动到文件开头

Lseek(int fildes, 0, SEEK_SET);

将文件读写指针移动到文件尾

Lseek(int fildes, 0, SEEK_END);

获取文件读写指针当前的位置

Lseek(int fildes, 0, SEEK_CUR);

Linux系统不允许lseek()对tty设备进行操作。

 

代码:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>

 

int ReadData(int fd)

{

       intlen;

       intret;

       inti;

       charread_buf[64];

      

       if(lseek(fd,0, SEEK_END) == -1)

       {

              printf("LseekError Line:%d ! \n", __LINE__);

       }

       len= lseek(fd, 0, SEEK_CUR);

       if(len== -1)

       {

              printf("LseekError Line:%d ! \n", __LINE__);

       }

       if(lseek(fd,0, SEEK_SET) == -1)

       {

              printf("LseekError Line:%d ! \n", __LINE__);

       }

 

       printf("Len:%d \n", len);

 

       //read data

       ret= read(fd, read_buf, len);

       if(ret< 0)

       {

              printf("ReadError Line:%d ! \n", __LINE__);

       }

 

       //print data

       for(i= 0; i < len; i++)

       {

              printf("%c",read_buf[i]);

       }

       printf("\n");

 

       returnret;

}

 

int main(int argc, char **argv)

{

       intfd;

       charwrite_buf[256] = "hello world, i xxxxxxxxxxxxxxxxxxxxxxxxx";

 

       fd= open("example.c", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU);

       if(fd== -1)

       {

              printf("OpenError Line:%d ! \n", __LINE__);

       }

       else

       {

              printf("createfile success! \n");

       }

 

       //writedata

       intwriteLen = write(fd, write_buf, strlen(write_buf));

       if(writeLen != strlen(write_buf))

       {

              printf("WriteError Line:%d ! \n",__LINE__);

       }

 

       ReadData(fd);

 

       printf("\n/*------------------------------------*/\n");

       if(lseek(fd,10, SEEK_END) == -1)

       {

              printf("LseekError Line:%d ! \n", __LINE__);

       }

      

       writeLen= write(fd, write_buf, strlen(write_buf));

       if(writeLen!= strlen(write_buf))

       {

              printf("WriteError Line:%d ! \n", __LINE__);

       }

 

       ReadData(fd);

 

       close(fd);

 

       return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: