与文件进行通信
文件使用函数:
fopen();
getc();
putc();
exit();
fclose();
fprintf();
fscanf();
fgets();
fputs();
rewind();
fseek();
ftell();
fflush();
fgetpos();
fsetpos();
feof();
ferror();
ungetc();
setvbuf();
fread();
fwrite();
文件重定向:程序与文件交互的形式(程序从文件中读取信息或者把信息写入文件)
文件通常是在存储介质上一段已命名的存储区
所有文件的内容都是以二进制形式存储
C把文件看做是一系列连续的字节,每个字节都能被单独读取
C提供两种访问文件的途径:
1:文本模式:把本地环境表示的行末尾或文件结尾映射为C模式
2:二进制模式:程序可以访问文件中的每个字节
文本文件格式:使用二进制编码的字符
二进制文件格式:二进制值代表机器语言代码或者数值数据、图片、音乐编码
文本内容:包含文本内容
二进制内容:包含二进制内容
I/O级别(处理文件访问的两个级别)
1:底层I/O(low_level I/O)使用操作系统提供的基本I/O服务。
2:标准高级I/O(standard high_level I/O)使用C库的标准包和stdio.h文件头定义。
C程序会自动打开3个文件
1:标准输入standard input 系统的普通输入设备通常是键盘
2:标准输出standard output 系统的普通输出设备通常是显示屏
3:标准错误输出standard error output 系统的普通输出设备通常是显示屏
可以重定向把其他文件视为标准输入或标准输出,或标准错误输出。也可以为标准错误输出提供一个逻辑上不同的地方来发送错误信息,便于查看错误信息。
标准I/O
标准I/O的特性
1:可移植性
2:标准I/O有许多专门的函数简化处理了不同的I/O的问题
3:输入和输出都是缓冲
3A:缓冲:当文件读取文件时,一块数据(转移单位为块通常至少512字节)被拷贝到缓冲区(一块中介存储区域),缓冲极大提高了数据传输速率,程序可以检查缓冲区的字节,缓冲在后台处理,让人有种逐字符访问的错觉
//以下例子在Windows下,编译后再命令提示窗口运行该程序
int main(int argc, char *argv[])
{
int ch;
FILE *fp;//文件指针
unsigned long count = 0;//计数器
if(argc<2)//默认只有一个参数的情况下输出当前程序的文件名
{
printf("Usage:%s filename\n",argv[0]);
exit(EXIT_FAILURE);
}
if((fp=fopen(argv[1],"r"))==NULL)//文件指针==NULL说明打开失败
{
printf("Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while((ch=getc(fp))!=EOF)//不到文件结尾就获取一个字符
{
putc(ch, stdout);//输出一个字符到标准输出设备
count++;
}
fclose(fp);//关闭文件
printf("File %s has %lu characters\n", argv[1], count);//输出文件路径,字符数
return 0;
}
//在库的宏定义
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define EOF (-1)
#define stdin (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))
//FILE在stdio.h的定义
#ifndef _FILE_DEFINED
#define _FILE_DEFINED
typedef struct _iobuf
{
void* _Placeholder;
} FILE;
#endif
//以下为谭浩强书内代码
typedef struct
{
short level;//缓冲区满或者空的程度
unsigned flags;//文件状态标志
char fd;//文件描述符
unsigned char hold;//如缓冲区无内容不读取字符
short bsize;//缓冲区的大小
unsigned char *buffer;//数据缓冲器用的位置
unsigned char *curp;//指针当前的指向
unsigned istemp;//临时文件指示器
short token;//用于有效性检查
}FILEI;