一、文件類型
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 <assert.h>
#include <string.h>
{
FILE *fr = fopen(srcpath,"rb");//讀權限,打開已有的文件
FILE *fw = fopen(despath,"wb");//寫權限,創建一個新文件
assert(fr!=NULL && fw!=NULL);
char buf[1024];//緩存
int len;
while((len=fread(buf,1,1024,fr)) > 0)//len用來接收讀進來的實際大小,>0 && <1024*1表示讀進去字符了
{
fwrite(buf,1,len,fw);
}
fclose(fw);
}
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';
要想修改字符串的值,一定把它置成數組