一、文件类型
1.二进制文件:非文字形式,如图片,音乐,电影
2.文本文件:文字形式
二、外存和内存
1.外存:如磁盘(如机械硬盘,固态硬盘[速度快])、磁带、CD,外存速度慢,掉电保护
2.内存,速度快,掉电不保护,速度越快,价格越贵
三、文件的输入和输出
1.以内存为参照物,流入内存,叫做输入
2.文件名是文件的唯一标识 唯一指的是全路径
3.windows下文件名不区分大小写
4.后缀名:关联默认打开它的应用程序,不会改变文件的内容
5.wma,ape,flac:无损音乐,很大:20M、30M ,如CD
mp3:有损音乐 320 128 64 越高保真度越高
每种音乐的编码不一样,解码就不一样
6.ape的后缀名改为txt,怎么还能正常打开此音乐?
在每个文件的开头,有个魔术的概念,魔术的作用是文件的自我介绍
有的音乐软件为了用户只能在他的软件上播放,就将魔术名的位置改变,本来魔术在第20-30个字节出现,他们在第20个字节随便加几个,那么魔术就被破坏了,这样标准的播放器就识别不了这个文件的自我介绍。
四、网盘
1.保存非法的文件,网盘上就找不到它了,因为网盘会窥视你的文件,从而判断你的文件是否合法
2.缓存:用在高速设备和低速设备的过渡,比如磁盘和内存之间
磁盘《--》缓存(10M、20M)《--》内存《--》cpu缓存
3.缓冲:用在流媒体里
4.虚拟内存:磁盘的一部分,将等待的进程放在磁盘里,以备替换内存里的进程,速度慢 速度越快,价格越贵,生产工艺越难
5.移动设备的概念
ROM:磁盘 平常所说的64G,32G的手机,相当于固态硬盘
RAM:内存 比如手机内存2/4G
五、文件系统
1.文件系统:管理文件的管家
(1)微软最新的文件系统:NTFS
(2)windowsxp、优盘的文件系统:fat32
(3)Linux的文件系统:ext3、ext4
2.文件系统特点:放得多、高效、安全
高效:文件系统有好的,也有一般的,文件系统有缓存区,缓存:提高了速度
安全:比如某一磁道、磁盘坏了,其它的还可以用
3.文件操作易错点:打开文件失败,原因:文件名错误
#include <stdio.h>#include <assert.h>
#include <string.h>
void FileCopy(const char *despath,const char *srcpath)
{
FILE *fr = fopen(srcpath,"rb");//读权限,打开已有的文件
FILE *fw = fopen(despath,"wb");//写权限,创建一个新文件
assert(fr!=NULL && fw!=NULL);
char buf[1024];//缓存
int len; //fread: 通过返回值判断文件结尾
while((len=fread(buf,1,1024,fr)) > 0)//len用来接收读进来的实际大小,>0 && <1024*1表示读进去字符了
{
fwrite(buf,1,len,fw);
}
fclose(fr); //关闭文件
fclose(fw);
}
int main() {
char *path1 = "test.cpp";//相对路径
char *path2 = "D:\\1.cpp";//绝对路径
FileCopy(path2,path1);//调用文件Copy函数
}
int len = fwrite(buf,sizeof(char),strlen(buf),fw);//文件函数不管'\0'
4.fopen不能创建文件夹
5.文件位置指针(光标) fseek
(1)移动文件位置指针(移动光标)
(2)3个参照物:开头、光标当前位置、结尾
6.怎样测文件的大小?
/* 解题思路: 以只读方式打开某一文件,然后将文件指针定位在文件结尾的位置,利用ftell函数返回指针的在文件中的相对位置即可。*/
#include "stdio.h"
main()
{
FILE
*fp;
/*定义文件指针*/
long
cnt;
/*定义变量cnt用来存储文件大小数据*/
fp=
fopen
(
"c:\\1.txt"
,
"r"
);
/*此处请填写测试文件的地址,并以只读("r")方式打开文件*/
if
( fp==NULL )
/*如果打开的文件不存在,则退出*/
{
exit
(0);
printf
(
"文件打开失败!"
);
}
fseek
(fp,0L,SEEK_END);
/*利用fseek函数将指针定位在文件结尾的位置*/
cnt=
ftell
(fp);
/*利用ftell函数返回指针相对于文件开头的位置,以字节计算*/
printf
(
"文件所占的字节数为%ld个\n"
,cnt);
/*进行输出*/
}
六、一些小知识
不安全问题:数组可能越界,如strcpy函数
strcpy_s();//C99,C11建议函数,所以gcc里没有这个函数
char *str1 = "abcde";//4B 它是个字符串常量,所以不能修改它的值
char str2[] = "abcde";//6B 它是个字符串数组
str1 = str2;//这样str1就不会崩溃了,因为str1是一个指针,现在让str1指向str2了,所以就可以修改str1的值了
str1[0] = 'x';
str2[0] = 'x';
要想修改字符串的值,一定把它置成数组