linix对IO文件的操作分为不带缓存的IO操作(文件IO都是不带缓存IO)和带缓存的标准IO操作.
刚开始,要明确以下几点:
不带缓存,其实不是直接对磁盘文件进行读取操作,像read()和write()函数,它们都属于系统调用,只不过在用户层没有缓存,所以叫做无缓存IO,但对于内核来说,还是进行了缓存,只是用户层看不到罢了。
1. linux的文件I/O是一种低级的I/O,由操作系统提供的基本IO服务。(底层)
而标准I/O是ANSIC建立的一种标准I/O模型,是一种标准函数包和stdio.h头文件中的定义,具有一定的可移植性。(标准库封装)
2. 标准I/O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构。
文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。
3. 所有I/O函数都是针对文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。
而对于标准I/O库,它们的操作则是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使用一个流与一个文件相关联。
4. 标准的 C 库函数(标准io)建立在底层系统调用(文件io)之上,即 C 函数库文件访问函数的实现中使用了文件 I/O 系统调用。
标准的 C 库中的文件处理函数为了减少使用系统调用的次数,提高效率,根据应用的不同,采用几种缓冲区机制,这样,在对磁盘文件进行读操作时,可以一次性地从文件中读出大量数据到缓冲区中,以后对这部分数据的访问就不需要再使用系统调用了。在对磁盘文件进行操作时,可以先将内容存储在文件缓冲区中,待文件缓冲区满后再用系统调用将该文件一次写入到磁盘。
5. 标准io不能对设备进行操作;
open()则可以
----------------------------------------------------------------------
下面几个文件IO是不带缓存的IO。
•open(),creat()函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数
•close()函数用于关闭一个被打开的文件,当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显式地关闭一个文件
•read()函数用于将从指定的文件描述符中读出的数据放到缓存区中。
返回实际读入的字节数。若返回0,则表示没有数据可读,即已达到文件尾。读操作从文件当前指针位置开始
•write() 会把参数buf 所指的内存写入 count 个字节到参数 fd所指的文件内. 当然, 文件读写位置也会随之移动.
如果顺利write()会返回实际写入的字节数. 当有错误发生时则返回-1, 错误代码存入errno 中.
•lseek()函数用于在指定的文件描述符中将文件指针定位到相应的位置。
只能用在可定位(可随机访问)文件操作中。
管道、套接字和大部分字符设备文件是不可定位的,所以在这些文件的操作中无法使用lseek()调用。
Linux 系统不允许lseek()对tty 装置作用, 此项动作会令lseek()返回ESPIPE。
。。。。。。。。
再列举一些标准IO:
FILE *fopen (__const char *__restrict __filename, __const char *__restrict __modes);
int fclose (FILE *__stream);
int fcloseall (void);
int fflush (FILE *__stream);
int fgetc (FILE *__stream);
int getc (FILE *__stream);
int getchar (void); //从标准输入设备读一个字符
int fputc (int __c, FILE *__stream);//写字符 c 到流 stream 中
int putc (int __c, FILE *__stream);
int putchar (int __c); //写字符 c 到标准输出设备 char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
char *gets (char *__s);/此函数尽量不要使用,因为它对读出量没有限制
int fputs (__const char *__restrict __s, FILE *__restrict __stream)
int puts (__const char *__s); //输出流到标准出设备中
size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE*__restrict __stream)
size_t fwrite (__const void *__restrict __ptr, size_t __size, size_t __n,FILE*__restrict __s)
int feof(FILE * __stream)
int ferror (FILE *__stream)
void clearerr (FILE *__stream)
long int ftell (FILE *__stream)
int fseek (FILE *__stream, long int __off, int __whence)
void rewind (FILE *__stream)
int fscanf (FILE *__restrict __stream, __const char *__restrict __format, ...)
int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...)
-----------------------------------------------------------
int fileno(FILE *fp);
注意:fileno不是ISO C标准部分,而是POSIX支持的扩展。