c语言复习之文件(十三)
1.概念
1.文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用
文件名标识(被称为文件名)包括:
- 文件路径———->文件在外部存储设备中的位置
- 文件名主干
- 文件名后缀——->文件性质
2.文件分类
-
文本文件:每一个字节放一个ASCII代码
-
二进制文件:把内存中的数据按照其在内存中的存储形式原样输出到磁盘存放
二进制快且小!!!
3.文件缓冲区
效率高
4.文件指针
FILE*
- stdin 标准输入文件指针 控制台 可以重定向
- stdout 输出… 控制台
- stderr 错误… 控制台
5.文件指针位置
表示当前的读写位置
2.操作
1.文件的打开与关闭
1.打开
FILE* fopen(char const* _FileName,char const* _Mode)//文件名,打开模式(读写)
//指向打开的文件(返回空,非空)
2.关闭
int fclose(FILE* _stream)
3.打开模式
1.r,a,w
//1.r只读--->存在--->不存在则打开失败
//2.w只写--->如果文件存在,则清除原文件内存后写入,否则,创建文件后写入
//3.a追加只写-->存在,则位置指针移动到文件末尾写入,不删除原数据
//不存在,打开失败
2.r+,w+,a+
在原有的基础上可读可写
3.rb,wb,ab
在rwb基础上,二进制
4.rb+,wb+,ab+
在rba+基础上,二进制
4.文件名非法
\ : * ? “” < > |
2.文件读写—>灵活
1.字符形式(一个字符)
//1.读取,读取成功时返回读到的字符,读取到文件末尾或者读取失败返回EOF
int fgetc(FILE* _stream);
//2.判断文件操作是否出错,出错时返回非零值,否则返回零值
int ferror(FILE* fp);
//3.字符写入函数fputc
int fputc(int ch,FILE* _stream);
//ch为要写入的字符,_stream为文件指针,写入成功时返回写入的字符,失败时返回EOF,
//返回类型为int也是为了容纳这个负数
//4.重置光标,重置光标到文件开头
rewind(FILE* fp);
//5.feof判断文件内部指针是否指向了文件末尾,当指向了文件末尾时返回非零值
//否则返回零值
int feof(FILE* _stream);
//6.perror()将文件错误信息输出到屏幕
2.字符串形式读写
1.读字符串函数
char* fgets(char* _Buffer,int _Maxcount,FILE* _stream)
- 说明:从指定文件中读取一个字符串,并保存到字符数组中
- Buffer:字符数组
- Maxcount:为要读取的字符数量(不要超过Buffer字符数组的大小)
- steam:为文件指针
- 返回值:读取成功时返回字符数组首地址,也就是Buffer;读取失败时返回NULL;如果开始读取文件时文件内部指针已经指向了文件末尾,那么读取不到任何字符,也返回NULL
- 注意:读取到
Maxcount-1
个字符之前如果出现了换行,或者读取到了文件末尾,则读取结束,这就意味这,不管Maxcount
多大,fgets()最多只能获取一行数据,不能跨行,在c语言中,没有按行读取文件的函数,我们可以借助fgets()将Maxcount
的值设置的足够大,每次就可以读取到一行数据- BUFSIZ宏—>512
2.写字符串函数
int fputs(char const* _Buffer,FILE* _stream)
3.格式化读写
fscanf(fp,)//格式化读取
fprintf(fp,)//格式化写入
//后面的格式与scanf、printf一样
4.二进制读写—>块数据
fread();fwrite();
fread(void* Buffer(地址),size_t Elementsize(每个大小),size_t Elementcount(个数),FILE* _stream);
//极限:4kb左右--->大小*个数
//返回值:返回成功读写的快数(count),如果返回值小于count
//1.fread()可能读取到了文件末尾,发生错误
//2.fwrite()写入错误
5.随机读写
一般用于二进制文件,文本文件需要转换
fseek()用来将指针移动到任意位置
注意:随机读写不会插入——>覆盖
int fseek(FILE* _stream,long offset, int origin);
offset:偏移量,正前负后
origin:起始位置,从何处开始计算偏移量
//文件开头 SEEK_SET 0
//当前位置 SEEK_CUR 1
//文件末尾 SEEK_END 2
6.获取文件大小
int fillSize(const char* fileName)
{
FILE* fp=fopen(fileName,"rb");
if(!fp)
{
peeror("open failed!");
return 0;
}
fseek(fp,0,SEEK_END);
int size=ftell(fp);//返回当前下标
//文件特别大时,可以使用 _ftelli64 lld型
fclose(fp);
return size;
}//引用时文件名加双引号
7.重定向
标准输入函数:除了从控制台输,还可以:
-
freopen("重定向到哪个文件","方式",stdin);
重定向到哪个文件—>将输入定向到该文件
恢复重定向:
freopen("CON","方式",stdin);
-
输出:
freopen("将输出定向到该文件","方式",stdout);
恢复“CON”