文件处理
C语言程序在进行文件操作时遵循如下操作步骤: 打开->读写操作->关闭, 通俗地说, 打开是获取文件结构、系统为文件分配缓冲区的过程。不打开文件就不能对其进行读写,关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源。
在进行文件操作时,系统自动与3个标准设备文件联系,这3个文件无需打开和关闭,它们的文件指针分别是:
stdin:标准输入文件指针,系统分配为键盘。
stdout:标准输出文件指针,系统分配为显示器。
stderr:变准错误输出文件指针,系统分配为显示器。
gets(str);
puts(str);
//------------------------
fgets(str, 1024, stdin);
fputs(str, stdout);
上面两段代码其实是一样的,可以把gets、puts看作是fgets、fputs的特殊情况。
在文件中,文件末尾的接触符是"EOF"。
二进制文件中会包含多个"EOF",所以不能单纯把"EOF"看作结束符
在复制文件/二进制文件时,会在末尾多加一个文件结束符(EOF)。在文件操作时要注意跳过EOF。
获取文件大小,理论上都用rb方式。如果一定要用r方式,遇到\n需要加1。
文件操作中,文件换行是有区别的,"文本文件"是以"\r\n"作为换行。
文本文件 写入文件\n转成\r\n 读取文件转成 \n
二进制方式 写入/读取 \r\n
I/O操作:
I/O操作可以简单的看作是从程序移进或移出字节,这种搬运的过程便称为流(stream). 程序只需要关心是否正确地输出了字节数据,以及是否正确地输入了要读取字节数据,特定I/O设备的西街对程序员是隐藏的.
缓冲区文件处理方法:
缓冲文件系统: 高级文件系统, 系统自动为正在使用的文件开辟内存缓冲区.
非缓冲文件系统: 低级文件系统, 由用户在程序中为每个文件设定缓冲区.
文件重定向:
> 输出到文件
>> 追加到文件
< 文件内容输入到程序
文件类型指针:
指针变量说明: FILE *fp
struct _iobuf
{
char *_ptr;//当前缓冲区内容指针
int _cnt;//缓存区还有多少个字节
char *_base;//缓冲区的起始地址
int _flag;//文件流的状态,是否错误或者结束
int _file;//文件描述
int _charbuf;//双字节缓冲,缓冲2个字节
int _bufsiz;//缓冲区大小
char *_tmpfname;//临时文件名
}
typedef struct _iobuf FILE;
用法:
文件打开时, 系统自动建立文件结构体, 并把指向它的指针返回来, 程序通过这个指针获得文件信息, 访问文件.
文件关闭后, 它的文件结构体被释放.
文件指针是操作系统来管理的
C文件操作用库函数实现,包含在stdio.h中
文件使用方式 含义
r/rb(只读) 为输入打开一个文本/二进制文件
w/wb(只写) 为输出打开或建立一个文本/二进制文件
a/ab(追加) 向文本/二进制文件尾追加数据
r+/rb+(读写) 为读/写打开一个文本/二进制文件
w+/wb+(读写) 为读/写建立一个文件/二进制文件
a+/ab+(读写) 为读/写打开或建立一个文本/二进制文件
FILE *fp = fopen(文件路径, 操作符);
文件操作函数:
fopen(); 获得文件指针。
FILE *fp = fopen(文件路径, 操作符);
fclose(); 注销文件指针。
fclose(fp);
fgetc(); 读字符
char ch = fgetc(fp);
fputc(); 写字符
fputc(fp, 'c');
feof(); 判断是否是文件尾部,是返回1 不是返回0
feof(文件指针);
fgets(); 读取一行;
fgets(储存变量, 最大长度, 文件指针);
fputs(); 把字符串写入到文件
fputs(文件路径, 文件指针);
fseek(); 移动文件指针
SEEK_CUR 当前
SEEK_END 结尾
SEEK_SET 开始
fseek(文件指针, 移动量(可以是负数), SEEK_END);
ftell(); 获取当前指针距离文件开头的长度。
ftell(文件指针);
fflush(文件指针); 刷新文件
rewind(文件指针); 指针回归到起始位置
fread()
读取长度 = fread(保存字符串, 类型长度, 读取长度, 文件指针);
fwrite()
写入长度 = fwrite(要写入的字符串, 类型, 长度, 文件指针);
fprintf()
fscanf()
筛选读取
perror("错误是"); 提示错误,并中断执行
ferror(文件指针); 检测文件异常
clearerr(); 清楚异常 在文件指针回到开头
无缓冲方式I/o
#include <io.h> //IO操作库
#include <fcntl.h> //控制文件打开
#include <sys/stat.h> //系统底层库 IO操作是直接操作系统底层的。
_open(); 开打文件
_open(文件地址, 打开方式);
//#define O_RDONLY _O_RDONLY 只读
//#define O_WRONLY _O_WRONLY 只写
//#define O_RDWR _O_RDWR 读写
//#define O_APPEND _O_APPEND 增加
//#define O_CREAT _O_CREAT 创建
//#define O_TRUNC _O_TRUNC
//#define O_EXCL _O_EXCL
//#define O_TEXT _O_TEXT 文本
//#define O_BINARY _O_BINARY 二进制
//#define O_RAW _O_BINARY
//#define O_TEMPORARY _O_TEMPORARY 临时
//#define O_NOINHERIT _O_NOINHERIT
//#define O_SEQUENTIAL _O_SEQUENTIAL
//#define O_RANDOM _O_RANDOM 随机读写
_read(文件指针, 保存指针, 读大小); 读
返回读多少
按字符读,不是行
_close(文件指针); 关闭
_write(文件指针, 内容, 内容大小); 写
返回写多少
_lseek(文件指针, 移动长度, 方式);
C语言程序在进行文件操作时遵循如下操作步骤: 打开->读写操作->关闭, 通俗地说, 打开是获取文件结构、系统为文件分配缓冲区的过程。不打开文件就不能对其进行读写,关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源。
在进行文件操作时,系统自动与3个标准设备文件联系,这3个文件无需打开和关闭,它们的文件指针分别是:
stdin:标准输入文件指针,系统分配为键盘。
stdout:标准输出文件指针,系统分配为显示器。
stderr:变准错误输出文件指针,系统分配为显示器。
gets(str);
puts(str);
//------------------------
fgets(str, 1024, stdin);
fputs(str, stdout);
上面两段代码其实是一样的,可以把gets、puts看作是fgets、fputs的特殊情况。
在文件中,文件末尾的接触符是"EOF"。
二进制文件中会包含多个"EOF",所以不能单纯把"EOF"看作结束符
在复制文件/二进制文件时,会在末尾多加一个文件结束符(EOF)。在文件操作时要注意跳过EOF。
获取文件大小,理论上都用rb方式。如果一定要用r方式,遇到\n需要加1。
文件操作中,文件换行是有区别的,"文本文件"是以"\r\n"作为换行。
文本文件 写入文件\n转成\r\n 读取文件转成 \n
二进制方式 写入/读取 \r\n
I/O操作:
I/O操作可以简单的看作是从程序移进或移出字节,这种搬运的过程便称为流(stream). 程序只需要关心是否正确地输出了字节数据,以及是否正确地输入了要读取字节数据,特定I/O设备的西街对程序员是隐藏的.
缓冲区文件处理方法:
缓冲文件系统: 高级文件系统, 系统自动为正在使用的文件开辟内存缓冲区.
非缓冲文件系统: 低级文件系统, 由用户在程序中为每个文件设定缓冲区.
文件重定向:
> 输出到文件
>> 追加到文件
< 文件内容输入到程序
文件类型指针:
指针变量说明: FILE *fp
struct _iobuf
{
char *_ptr;//当前缓冲区内容指针
int _cnt;//缓存区还有多少个字节
char *_base;//缓冲区的起始地址
int _flag;//文件流的状态,是否错误或者结束
int _file;//文件描述
int _charbuf;//双字节缓冲,缓冲2个字节
int _bufsiz;//缓冲区大小
char *_tmpfname;//临时文件名
}
typedef struct _iobuf FILE;
用法:
文件打开时, 系统自动建立文件结构体, 并把指向它的指针返回来, 程序通过这个指针获得文件信息, 访问文件.
文件关闭后, 它的文件结构体被释放.
文件指针是操作系统来管理的
C文件操作用库函数实现,包含在stdio.h中
文件使用方式 含义
r/rb(只读) 为输入打开一个文本/二进制文件
w/wb(只写) 为输出打开或建立一个文本/二进制文件
a/ab(追加) 向文本/二进制文件尾追加数据
r+/rb+(读写) 为读/写打开一个文本/二进制文件
w+/wb+(读写) 为读/写建立一个文件/二进制文件
a+/ab+(读写) 为读/写打开或建立一个文本/二进制文件
FILE *fp = fopen(文件路径, 操作符);
文件操作函数:
fopen(); 获得文件指针。
FILE *fp = fopen(文件路径, 操作符);
fclose(); 注销文件指针。
fclose(fp);
fgetc(); 读字符
char ch = fgetc(fp);
fputc(); 写字符
fputc(fp, 'c');
feof(); 判断是否是文件尾部,是返回1 不是返回0
feof(文件指针);
fgets(); 读取一行;
fgets(储存变量, 最大长度, 文件指针);
fputs(); 把字符串写入到文件
fputs(文件路径, 文件指针);
fseek(); 移动文件指针
SEEK_CUR 当前
SEEK_END 结尾
SEEK_SET 开始
fseek(文件指针, 移动量(可以是负数), SEEK_END);
ftell(); 获取当前指针距离文件开头的长度。
ftell(文件指针);
fflush(文件指针); 刷新文件
rewind(文件指针); 指针回归到起始位置
fread()
读取长度 = fread(保存字符串, 类型长度, 读取长度, 文件指针);
fwrite()
写入长度 = fwrite(要写入的字符串, 类型, 长度, 文件指针);
fprintf()
fscanf()
筛选读取
perror("错误是"); 提示错误,并中断执行
ferror(文件指针); 检测文件异常
clearerr(); 清楚异常 在文件指针回到开头
无缓冲方式I/o
#include <io.h> //IO操作库
#include <fcntl.h> //控制文件打开
#include <sys/stat.h> //系统底层库 IO操作是直接操作系统底层的。
_open(); 开打文件
_open(文件地址, 打开方式);
//#define O_RDONLY _O_RDONLY 只读
//#define O_WRONLY _O_WRONLY 只写
//#define O_RDWR _O_RDWR 读写
//#define O_APPEND _O_APPEND 增加
//#define O_CREAT _O_CREAT 创建
//#define O_TRUNC _O_TRUNC
//#define O_EXCL _O_EXCL
//#define O_TEXT _O_TEXT 文本
//#define O_BINARY _O_BINARY 二进制
//#define O_RAW _O_BINARY
//#define O_TEMPORARY _O_TEMPORARY 临时
//#define O_NOINHERIT _O_NOINHERIT
//#define O_SEQUENTIAL _O_SEQUENTIAL
//#define O_RANDOM _O_RANDOM 随机读写
_read(文件指针, 保存指针, 读大小); 读
返回读多少
按字符读,不是行
_close(文件指针); 关闭
_write(文件指针, 内容, 内容大小); 写
返回写多少
_lseek(文件指针, 移动长度, 方式);