文件操作

来源:互联网 发布:在端口3306连接失败 编辑:程序博客网 时间:2024/05/15 00:37

一. Linux下文件的该概念是什么?

Linux中的文件具有的特点是:可通过操作系统或者程序对外提供信息,也能对内输入信息,可以被创建,删除。

Linux中,文件有特别重要的意义,他们为操作系统和设备提供了一个简单而统一的接口。在Linux中,几乎一切都可以看做是文件 。

这就意味着,普通程序完全可以像使用文件(普通定义)那样使用磁盘文件、串行口、打印机和其他设备。

硬件设备在linux操作系统中也被表示为文件。

 

二. Linux下文件的操作有哪些?

和操作一般意义上的文件一样,linux中对文件的操作只需要五个基本的函数:

openclosereadwriteioctl

通过调用这几个函数就能对linux中的文件进行读、写等操作。不过,这种操作又分为系统调用库函数调用。简单的说,系统调用是最直接的方式,

库函数调用最终也是通过系统调用实现的。可认为库函数调用是对系统调出于效率考虑而做出的优化。

 

三. 如何来访问一个文件

通过系统调用来访问文件是最直接的方式。系统调用函数直接作用于操作系统内核的设备驱动程序从而实现文件访问。

 

四. 文件里面都有那些描述符?

在系统中需要处理的文件(读、写操作)需要一个标识,以便在其它地方能识别出这个文件,于是就产生了文件描述符。文件描述符是一些小值整数,简单的说就是

一个文件ID用于在系统中唯一的标识文件。文件描述符的总数也就是系统可以打开文件的最多个数,这取决于系统的配置情况。

当开始运行程序时,也就是系统开始运行时,它一般会有三个已经打开的文件描述符。他们是:

· 0:标准输入

· 1:标准输出

· 2:标准错误

其它文件的文件描述符,在调用文件打开函数open时返回。这就是说,每个设备对应着一个文件描述符。文件描述符由操作系统分配,每次分配最小的。

 

五. 关于write系统调用的说明

write,就是把缓冲区的数据写入文件中。注意,这里的文件时广泛意义的文件,比如写入磁盘、写入打印机等等。

Linuxwrite()的函数原型:

size_t write(int fildes, const void *buf, size_t nbytes);

参数说明:

fildes:文件描述符,标识了要写入的目标文件。例如:fildes的值为1,就像标准输出写数据,也就是在显示屏上显示数据;如果为,则想标注错误写数据。

*buf:待写入的文件,是一个字符串指针。

nbytes:要写入的字符数。

函数返回值:size_t  返回成功写入文件的字符数。需要指出的是,write可能会报告说他写入的字节比你所要求的少。这并不一定是个错误。在程序中,你需要检查

error已发现错误,然后再次调用write写入剩余的数据。

 


六. 关于read系统调用的说明

系统调用read是从文件中读出数据。要读取的文件用文件描述符标识,数据读入一个事先定义好的缓冲区。他返回实际读入的字节数。

Linuxread的函数原型:

size_t read(int fildes, void *buf, size_t nbytes);

参数说明:

fildes:文件描述符,标识要读取的文件。如果为0,则从标准输入读数据。类似于scanf()的功能。

*buf:缓冲区,用来存储读入的数据。

nbytes:要读取的字符数。

返回值:size_t返回成功读取的字符数,它可能会小于请求的字节数。

 



七. 关于open系统函数的说明

系统调用open的作用是打开一个文件,并返回这个文件的描述符。

简单地说,open建立了一条到文件或设备的访问路径。如果操作成功,它将返回一个文件描述符,readwrite等系统调用使用该文件描述符对文件或

设备进行操作。这个文件描述符是唯一的,他不会和任何其他运行中的进程共享。如果两个程序同时打开一个文件,会得到两个不同的问价描述符。如果

同时对两个文件进行操作,他们各自操作,互补影响,彼此相互覆盖(后写入的覆盖先写入的)为了防止文件按读写冲突,可以使用文件锁的功能。这不是

本次重点,以后介绍。

Linuxopen的函数原型有两个:

int open(const char *path, int oflags);

int open(const char *path, int oflags, mode_t mode );

参数说明。

path:准备打开的文件或设备名字。

oflags:指出要打开文件的访问模式。open调用必须指定如下所示的文件访问模式之一:

 



八. 关于close系统函数调用的说明

close系统调用用于关闭一个文件,close调用终止一个文件描述符fildes以其文件之间的关联。文件描述符被释放,并能够重新使用。

close成功返回1,出错返回-1.

#Include<unistd.h>

int close(int fildes);

 



九. 其他和文件管理有关的系统调用有那些

1. 库函数

为了提高文件访问操作的效率,并且使得文件操作变得更方便,Linux发行版提供了一系列的标准函数库。他们是一些由函数构成的集合,你可以在自己的程序方便的中使用它们,

去操作文件。提供输出缓冲功能的标准I/O库就是这样的例子。你可以高效的写任意长度的数据块,库函数则在需要的时候安排底层函数调用(系统调用)

2. 标志I/O

 标准I/O库及其头文件<stdio.h>为底层I/O系统调用提供了一个通用的接口。这个库现在已经成为ANSI标准C的一部分,而前面所讲的系统调用却不是。

标准I/O库提供了许多复杂功能的函数,用于格式化输出和扫描输入,它还负责满足设备的缓冲需求。

在许多方面,使用标准I/O库和使用底层文件描述符类似。需要先打开一个文件,已建立一个文件访问路径(也就是系统调用中的文件描述符)

在标准I/O库中,与文件描述符对应的叫 流(stream),它被实现为指向结构FILE的指针。

在启动程序时,有三个文件流是自动打开的。他们是:

· stdin:标准输入

· stdout:标准输出

· stderr:标准错误输出

 



十. 常用的I/O库函数有哪些?

1.fopen函数

fopen函数类似于系统调用中的open函数。和open一样,它返回文件的标识符,只是这里叫做流(stream),在库函数里实现为一个指向文件的指针。

如果需要对设备的行为进行明确的控制,最好使用底层系统调用,因为这可以避免使用库函数带来的一些非预期的副作用,如输入/输出缓冲。

函数原型:

#include<stdio.h>

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

 

2. fread/fwrite函数

fread函数从文件流中读取数据,对应于系统调用中的readfwrite函数从文件流中写数据,对应于系统调用中的write

函数原型:

#include<stdio.h>

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

参数说明:

*ptr要读取数据的缓冲区,也就是要存放读取数据的地方。

size:指定每个数据记录的长度。

nitems: 计数,给出要传输的记录个数。

返回值:成功读取到数据缓冲区的记录个数,当到达文件尾时,他的返回值可能会消耗与nitems,甚至可以是0

size_t  fwrite(const coid *ptr, size_t size , size_t nitimes, FILE *stream);

他从指定的数据缓冲区ptr中把数据写入文件流,返回成功写入的记录个数。



3. fclose函数

fclose函数关闭指定的文件流stream,这个操作会使所有未写出的数据都写出。因为stdio库函数会对数据进行缓冲,所有调用fclose函数是很重要的。

如果程序需要确保数据已经全部写出,就应该调用fclose函数。虽然程序正常结束时,也会自动的调用fclose函数,但这样就不能检测出调用fclose所产生的错误了。

函数原型如下:

#include<stdio,h>

int fclose(FILE *stream);



4. fflush函数

fflush函数的作用是把文件流中所有未写出的数据全部写出。 处于效率考虑,在使用库函数的时候会使用数据缓冲区,当缓冲区满的时候才进行写操作。使用fflush函数

可以将缓冲区的数据全部写出,而不关心缓冲区是否满。fclose的执行隐含调用了fflush函数,所以不必再fclose执行之前调用fflush

函数原型:

#include<stdio.h>

int fflush(FILE *stream);


原创粉丝点击