Linux C编程文件IO
Linux文件IO简述
Linux中,一切皆文件。文件为操作系统服务和设备提供了一个简单而一致的接口。这意味着程序完全可以像使用文件那样使用磁盘文件、串行口、打印机和其他设备。也就是说,大多数情况下,你只需要使用5个函数: open、close、read、write和ioctl。 例外的情况: 目录的读写,网络连接等特殊文件.
Linux文件IO函数解析
- 终端
句柄编号 | 操作函数 | ||
---|---|---|---|
标准输入 | stdin | 0 | scanf |
标准输出 | stdout | 1 | printf |
标准错误 | stderr | 2 | perror |
- 缓冲区
名称 | 缓冲区大小 | 刷新缓存 |
---|---|---|
全缓冲 | 4096字节(4K) | 1.程序正常结束 2.缓存区满 3.fflush |
行缓冲 | 1024字节(1K) | 1、程序正常结束 2、缓存区满 3、遇到 ‘\n’ 4、fflush |
无缓冲 | 0 | 标准错误没有缓存,直接输出 (stderr) |
- 输入输出函数
函数名称 | 缓冲区 |
---|---|
int scanf(const char *format, …); | 遇到‘\n’刷新,为行缓冲 |
ssize_t read(0,buf,size) | 读满size字节数据,或者遇到EOF |
char *gets(char *s); | 遇到’\n’,行缓冲 |
printf | |
write(0,buf) | |
puts(0) | 遇到‘\n’,行缓冲 |
-
指定缓存区
- void setbuf(FILE *stream, char *buf);
- 为文件流设置缓冲区,
- 指向的buf 应该为一个4k的缓冲区。
- void setbuffer(FILE *stream, char *buf, size_t size);
- 为文件流设置大小为size字节的缓冲区
- void setlinebuf(FILE *stream);
- 为文件流设置行缓冲区
- int setvbuf(FILE *stream, char *buf, int mode, size_t size);
- 为文件流设置大小为size的缓冲区
- mode 缓冲模式
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
-
文件IO读写函数
Linux 文件IO 读写
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int write(int fd,char * buf,size_t size);
O_RDONLY,以只读打开文件
O_WRONLY, 以只写打开文件
O_RDWR.以可读可写打开文件
O_EXEC 以只执行打开文件
O_SEARCH 只搜索打开(应用目录)
常量的目的是在目录打开的时候验证它的搜索权限。对目录的群文件描述符的后续操作就不需要再次检查对该目录的搜索权限。(部分操作系统支持)
以上五个常量中必须要指定一个,下面的常量是可选的
O_APPEND 打开文件并在文件尾端增加。
O_CREAT 若文件不存在则创建文件,mode参数为创建的文件有哪些权限(rwx)
O_EXCL 只有陪同O_CREAT,有用,如果文件存在报错,不存在则创建文件
。。。其他常量基本用不到,这几个是通常要用到的常量选项。
C语言文件IO 读写
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
//FILE 结构体
struct _IO_FILE {
int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags
/* The following pointers correspond to the C++ streambuf protocol. */
/* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
char* _IO_read_ptr; /* Current read pointer */
char* _IO_read_end; /* End of get area. */
char* _IO_read_base; /* Start of putback+get area. */
char* _IO_write_base; /* Start of put area. */
char* _IO_write_ptr; /* Current put pointer. */
char* _IO_write_end; /* End of put area. */
char* _IO_buf_base; /* Start of reserve area. */
char* _IO_buf_end; /* End of reserve area. */
/* The following fields are used to support backing up and undo. */
char *_IO_save_base; /* Pointer to start of non-current get area. */
char *_IO_backup_base; /* Pointer to first valid character of backup area */
char *_IO_save_end; /* Pointer to end of non-current get area. */
struct _IO_marker *_markers;
struct _IO_FILE *_chain;
int _fileno;
int _blksize;
_IO_off_t _old_offset; /* This used to be _offset but it's too small. */
#define __HAVE_COLUMN /* temporary */
/* 1+column number of pbase(); 0 is unknown. */
unsigned short _cur_column;
signed char _vtable_offset;
char _shortbuf[1];
/* char* _save_gptr; char* _save_egptr; */
_IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};
//文件流定位
int fseek(FILE *stream, long offset, int whence);
SEEK_SET 文件开始的位置
SEEK_CUR
SEEK_END 文件结束的位置
long ftell(FILE *stream); 文件读写指针位置距离文件开始的字节数
void rewind(FILE *stream); 文件读写指针复位
上面三者都是打开文件的函数,他们分别的功能是:
(1)fopen函数打开路径名为path的一个指定文件。
(2)freopen函数在一个指定的文件流上打开一个指定的文件,如果文件流是打开的,则先关闭文件流。若该流已经定向,则使用freopen清除定向。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出、标准错误输出。
(3)fdopen函数取一个已有的文件描述符,并使一个标准的I/O流与该描述符相结合。该函数经常用于由创建管道和网络通信函数返回的描述符,因为这些特殊的类型的文件不能用标准I/O函数fopen打开,所以我们必须先调用设备专用函数以获得一个文件描述符,然后使用fdopen使一个标准I/O流与该文件描述符相结合。
三个函数的mode选项:
r和rb :以只读的方式打开文件,前提文件先存在。
w和wb:以只写的方式打开文件,文件不存在创建文件,文件存在会先清除文件内容从文件开始位置写数据。
a和ab:追加,在文件尾部写写而打开,或者为写而创建文件
r+和rb+和r+b:为读和写打开文件
w+和wb+和r+b:把文件截断置0长,或为读和写而打开
a+和ab+和a+b:在文件尾部读和写而打开或者创建