文件
存储在内存储器的集合,一般称为表,如数组;而存储在外部介质上的信息集合称为文件,如磁盘文件。
文件通常是驻留在外部介质(如磁盘等)上的,使用时才调入内存。
文件缓冲方式
1.行缓冲
标准库函数向标准输出屏幕输出东西时候是行缓冲
所谓的行缓冲就是缓冲区碰到换行符的时候刷新缓冲区
如果不刷新缓冲区,无法对文件进行读写操作
fflush(stdout);清除缓冲区
2.全缓冲
标准库函数往普通文件读取的数据的是全缓冲的,碰到换行符也不刷新缓冲区,缓冲区满了才刷新缓冲区
刷新缓冲区的情况,
a.缓冲区满了,刷新缓冲区
b.人为刷新缓冲区,用fflush
c.程序正常结束,会刷新缓冲区
3.无缓冲
在读写文件的时候,通过系统调用io,对文件进行读写数据,这个时候是无缓冲,数据会立马进入文件,读数据会立马进入内存
写文件的流程
应用程序空间,内核空间,驱动程序,硬盘上
应用程序和内核程序运行在不同的空间里,目的是为了保护内核
设置缓冲区的目的
通过缓冲可以减少进出内核的次数,提高效率
文件可分为文本文件和二进制文件
文本文件
基于字符编码,常见有ASCII,UNICODE。
二进制文件
基于值编码,
需要自己判断或使用特定软件分析数据格式
文件指针
- 文件缓冲区:每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态以及文件当前的位置),这些信息是保存在一个结构体变量之中 这个结构体变量叫 FIEL
- 文件指针:在C语言中用一个指针变量指向一个文件,通过文件指针就可以对它所指的文件进行各种操作。
-
一般通过一个FILE的指针来维护这个FILE结构的变量
-
文件指针定义的一般格式:
FILE 文件指针
其中:FILE
是文件缓冲区的类型名,必须大写;“文件指针”是指向文件缓冲区的指针
例如:
FILE* pf;//文件指针变量
三个特殊的文件指针
stdin 标准输入(键盘)
stdout 标准输出(屏幕)
stderr 标准出错(屏幕)
perror,程序出错时,会提示出现了什么问题
打开文件fopen
打开一个已经存在的文件并返回这个文件的文件指针,或者创建一个文件,并打开此文件,然后返回文件的标识示
FILE * fopen ( const char * filename, const char * mode );
文件模式:
“ r ”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“ w ”(只写) 为了输入数据,打开一个文本文件 建立一个新的文件
“ a ”(追加) 向文本文件尾添加数据 建立一个新的文件
“ r+ ”(读写) 为了读和写,打开一个文本文件 出错
“ w+ ”(读写) 为了读和写,建立一个新的文件 建立一个新的文件
“ a+ ”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“ rb ”(只读) 为了输入数据,打开一个二进制文件 出错
“ wb ”(只写) 为了输入数据,打开一个二进制文件 建立一个新的文件
“ ab ”(追加) 向一个二进制文件尾添加数据 出错
“ rb+ ”(读写) 为了读和写,打开一个二进制文件 出错
“ wb+ ”(读写) 为了读和写,建立一个新的二进制文件 建立一个新的文件
“ ab+ ”(读写) 打开一个二进制文件,在文件尾进行读写 建立一个新的文件
关闭文件fclose
int fclose(p);
这个文件只能关闭一次
读写文件
一次读写一个字符
int fgetc(p);
从文件指针所标识的文件中读取一个字节,将字节值返回
int fputc(int ,p)
一次读写一个字符串
char str[]
fgets(str,int size,fp);
char str[100];
char *pstr;
while((pstr = fgets(str, 100, fp)) != NULL)
{
printf("%s", pstr);
}
fputs(str,fp)
读文件fread
char *p
fread(pstr,块大小,几块,fp)
#include<string.h>
#include<stdio.h>
int main()
{
FILE *fp = fopen("./1.txt", "r");
if(fp == NULL)
{
printf("open failed\n");
}
char str[100];
fread(str, 10, 10, fp);
printf("%s\n", str);
fclose(fp);
return 0;
}
写文件write
fwrite(pstr,块大小,几块,fp)
#include<string.h>
#include<stdio.h>
int main()
{
FILE *fp = fopen("./1.txt", "a+");
if(fp == NULL)
{
printf("open failed\n");
}
char str[100] = "秋刀鱼的滋味,猫跟你都想了解~";
fwrite(str, 10, 10, fp);
rewind(fp);
fread(str, 10, 10, fp);
printf("%s", str);
fclose(fp);
return 0;
}
移动光标(将光标移到文件开头)
rewind(fp)