文件、文件系统

时间:2022-05-23 09:02:06

一、文件类型

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';

要想修改字符串的值,一定把它置成数组