一、文件三大核心内容
1.1打开文件
FILE* fp =fopen(“文件路径.后缀”,“以什么方式打开”);
打开文件的两种方式:以二进制形式打开文件、以文本文件形式打开文件
1.2读写操作
读操作:int num=fread(buffer,sizeof(),count,fp);
例如:char buff[256]; int num=fread(buff,char,256,fp);//代表的意思为,在fp所指向的文件中,一次读取最大容量256个sizeof(char),若不够256,将剩余内容读取给buff ,成功读取的剩余个数给到num
写操作:fwrite(buffer,sizeof(),count,fp);
char buff[256]; int num=fread(buff,char,256,fp);//代表的意思为,从buff数组中读取256个大小为sizeof(char)的元素,并写入fp所指向的文件路径中
buffer:代表数组,sizeof():代表元素字节大小,count:每次读或写元素的个数,fp:文件指针
1.3关闭文件
fclose(fp); //关闭fp所指向的文件路径
fp=NULL;
二、文件基本知识点
2.1操作系统是以文件为单位对数据进行管理
操作系统是以文件为单位对数据进行管理
2.2数据流
数据流:流表示从源端到终端(目的端)的流动 输入流(以内存为基础):数据从文件(外存)流向计算机内存
输出流(以内存为基础):数据从计算机内存流向文件(外存)
2.3文件路径
1.D:\1.txt <=> D:/1.txt
2.绝对路径(一定是从根目录开始的): 在Windows系统中:我们将文件保存到磁盘上:例如:C:/a/e/1.txt、 C盘也叫做根目录。 在Linux系统中:根目录/home/stu/1.txt(只有一个根目录)
3.相对路径(相对当前位置的路径):例如:当前C盘下的 Promgram File(X86)…
2.4文件打开方式
文本文件:.txt .cpp ASCII文件
二进制文件:多媒体 .ppt .mp3 .mv .jpg
例如:数值型数据既可以用ASCII形式存储,也可以用二进制形式存储:
如整数10000,用ASCII码形式输出到磁盘,则在磁盘中占5个字节(一个字符占一个字节),而用二进制形式输出,则在磁盘上只占4个字节(10000是整数古,int型)
2.5文件缓存
1.缓冲、缓存、虚拟内存区别: 缓存(cache):是数据的缓冲区、当硬件读取数据时,首先再缓存中查找需要的数据,如果找到数据,直接使用, 找不到,在缓存以外的地方查找(缓存运行速度>内存)
2.虚拟内存:计算机系统(内存管理)一种技术。 linux:交换空间 拥有一块连续的内存地址,实际将数据通常分割成多个物理内存碎片
3.缓冲:向硬件设备中写入数据,先将数据放入缓冲区,一起向硬盘中写入, 写—>输入缓冲区 输出缓冲区。 减少IO CPU—>缓存—>内存—>磁盘
2.6在.cpp文件中的读写模式
读写模式:
r:可读 、 r+:可读可写操作 (文件必须存在,文件不存在 打开失败)
w:可写 、w+:可读可写操作 (文件存在,将原有文件内容覆盖,文件不存在,创建新文件)
a:追加(文件尾巴)、 a+:可读可写操作 (存在该文件,追加文件尾部进行操作,文件不存在 创建新文件)
三、文件具体操作
3.1文件基本操作
int main() {
FILE* fp = fopen("d:/1.txt", "r+");
if (fp == NULL) {
printf("文件打开失败\n");
}
else {
printf("文件打开成功\n");
}
/*const char* str = "world";*/
//fwrite(str, sizeof(char),strlen(str),fp);
char buff[256] = { 0 };
int num=fread(buff, sizeof(char), 255, fp);
printf("读取个数:%d %s\n", num, buff);
fclose(fp);
fp = NULL;
}
3.2文件拷贝
int main() {
FILE* fp1 = fopen("文件操作.cpp", "r+");
assert("fp1!=NULL");
FILE* fp2 = fopen("文件操作2.cpp", "w+");
assert("fp2!=NULL");
int count = 0;
char buff;
while ((count=fread(&buff, sizeof(char), 1, fp1)) != 0) {
fwrite(&buff, sizeof(char), 1, fp2);
}
fclose(fp1);
fclose(fp2);
fp1 = NULL;
3.3移动光标
int main() {
FILE* fp1 = fopen("文件操作.cpp", "r");
fseek(fp1, 10, SEEK_SET);//向后移动光标,从头像后偏移10个字符,换行也算一个字符
//fseek(fp1, -2, SEEK_END);//向前移动光标
printf("%c\n", getc(fp1));
fclose(fp1);
}
3.4统计文件大小
/*SEEK_END:文件尾部
SEEK_CUR:文件当前位置
SEEK_SET:文件头部*/
int main() {
FILE* fp1 = fopen("文件操作.cpp", "r");
//统计文件大小,将光标移动到文件结尾处,在进行统计
fseek(fp1, 0, SEEK_END);//将光标移动到结尾处
long size=ftell(fp1);
printf("%d", size/1024);
fclose(fp1);
}
3.5 getc()、put()、的使用
//getc putc;从文件获取一个字符 等价fread fwrite fread返回值是读取个数,而getc返回值是字符
int main() {
FILE* fp1 = fopen("文件操作.cpp", "r");
char buff;
while ((buff=getc(fp1)) != EOF) { //fread(&buff,1,1,fp1)
//putc(fp1); //fwrite('a',1,1,fp1)
printf("%c", buff);
}
fclose(fp1);
}
3.6 关于printf、fprintf的使用
/* 标准输入 标准输出 标准错误
stdin stdout stderr*/
int main() {
printf("%d %d %d", 11, 12, 13);//...可变参数
fprintf(stdout, "%d", 11);
char buff[10] = { 0 };
sprintf(buff, "%d,%d,%d", 10,11, 12);//ATM 2020-1-23-00:00
char value=getc(stdin); //从键盘输入一个字符
putc(value, stdout);//从控制台输出该字符
putc('a', stdout);
FILE* fp = fopen("文件操作.cpp", "r");
}