Linux文件操作

来源:互联网 发布:淘宝快捷支付限额 编辑:程序博客网 时间:2024/06/05 20:37

文件操作的函数有很多,我简单总结以下几种:

一、系统调用函数

每个运行中的程序被称为进程,它有一些与之关联的文件描述符。有多少文件描述符可用取决于系统的配置情况。当一个程序开始运行它时,它一般会有3个已经打开的文件描述符。
0:标准输入
1:标准输出
2:标准错误

1.打开或创建一个文件
头文件: #include <fcntl.h>

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

pathname:文件路径+文件名
flag:文件打开方式:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(创建)

如果设置O_CREAT这个参数,说明打开的文件不存在,需要创建文件(同时打开 ),创建时需要第三个参数的支持:mode是文件权限,格式如0nnn(0 – 7)

返回值:成功则返回打开文件的标志,即文件描述符。失败返回1.

新文件描述符总是使用未用描述符的最小值,这个特征在某些情况下非常有用。

例如:如果一个程序关闭了它的标准输出,然后再次调用open,文件描述符1就会被重新使用,并且标准输出将被有效的重定向到另一个问价或设备。

#include<stdio.h>#incldue<stdlib.h>#include<fcntl.h>int main(){    close(1);    int fd=open("a.c",O_WRONLY | O_CREAT,0664);    printf("fd=%d\n",fd);    printf("hello world\n");    exit(0);}

运行结果:在a.c文件中输出fd=1
hello world

2.read函数
头文件: #include<unistd.h>

int read(int fd,void *buff,size_t size);

从与文件描述符fd相关联的文件里读入size个字节的数据,并把他们放入的数据区buff中。

返回实际读入的字节数,这可能会小于请求的字节数,如果read调用返回0,就表示未读入任何数据,已经到达了文件尾。同样,如果返回的是-1,就表示read调用出现了错误。

3.write函数
头文件: #include<unistd.h>

int write(int fd,void *buff,size_t size);

把缓冲区buff的前size个字节写入与文件描述符fd关联的文件中。

返回实际写入的字节数,如果文件描述符有错或者底层的设备驱动程序对数据块长度比较敏感,该返回值可能会小于size;如果这个函数返回0,就表示未写入任何数据;如果它返回的是-1,就表示在write调用中出现了错误,错误代码保存在全局变量errno里。

4.关闭文件
头文件: #include<unistd.h>

int close(int fd);

调用成功返回0,出错返回1.

5.lseek函数——为一个打开的文件设置偏移量
头文件: #include<unistd.h>

int lseek(int fd,int count,size_t pos);

pos的取值:SEEK_ CUR(当前位置)、SEEK_ END(文件尾)、SEEK_SET(文件头)
成功返回从文件头到文件指针被设置处的字节偏移值。失败返回-1.

二、库函数

头文件: # include<stdio.h>
1.打开文件

FILE *fopen(const char *fielname,const char *mode);

filename为文件名,mode是文件打开方式。
成功时返回非空FILE*的指针,失败时返回空值。

2.从文件读取字符

fread(void *  ptr,size_t  size, size_t nitems,FILE * stream);

数据从文件流stream读到ptr指向的数据缓冲区,size指定每个数据的长度,nitems记录要传输的个数。
返回值是成功读到数据缓冲区里的个数(而不是字节数),当到达文件尾时,它的返回值可能小于nitems,甚至是0.

常用方法:while(fread(&tmp,sizeof(int),1,fr)>0);是指从文件fr读取数据到tmp里面,每次读取一个整型数,整形师是4个字节。

3.向文件写入字符

fwite(const void *ptr,size_t size,size_t nitems,FILE *stream);

从指定缓冲区里取出数据记录,并把它们写入到输出流中。
返回值是成功写入的记录个数。

4.关闭文件

fclose(FILE*stream);

成功关闭返回0,否则返回EOF(-1)

5.fseek函数
fseek(文件类型指针,位移量,起始点)
光标位置:0,不动;负数,左移;正数,右移

fseek(fr,0,SEEK_SET);//以文件开头为参照物fseek(fr,_len*sizeof(int),SEEK_CUR);//以当前位置为参照物fseek(fr,_len*sizeof(int),SEEK_END);//以结尾为参照物

返回一个整数,0表示成功,-1表示失败

三、fopen和open的区别

(1)fopen返回结构体指针,open返回int类型的值
(2)fopen不能指定要创建文件的权限,open可以指定权限
(3)fopen有缓冲,open无缓冲
(4)fopen是库函数,open是系统调用函数

原创粉丝点击