文件、文件系統

一、文件類型

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章