目錄
一,文件
1.文本模式,二進(jìn)制模式
2.標(biāo)準(zhǔn)文件
二,文件的打開(kāi)和關(guān)閉
1.文件指針
1.1文件的打開(kāi)
?1.2文件的關(guān)閉
三,文件的順序讀寫(xiě)?
1.fgetc
2.fputc
3.fgets
4.fputs
5.fprintf
6.fscanf
7.fwrite
8.fread
?9.表格
四,文件的隨機(jī)讀寫(xiě)
1,fseek?
?2,ftell
3,rewind
判斷文件結(jié)束
1,feof
2,判斷結(jié)束
文件使用模式(表格)
文本文件的部分代碼示例
二進(jìn)制文件的部分代碼
一,文件
C把文件看作是一系列的連續(xù)的字節(jié),每個(gè)字節(jié)都能被單獨(dú)讀取。
C提供兩種文件模式:文本模式和二進(jìn)制模式
1.文本模式,二進(jìn)制模式
? ?首先要區(qū)分文本內(nèi)容和二進(jìn)制內(nèi)容,文本文件格式和二進(jìn)制文件格式,及文件的文本模式和二進(jìn)制模式。
- 文本內(nèi)容:如果文件最初使用的是二進(jìn)制編碼的字符(如ASCII碼)表示文本,該文件就是? ? ? ? ? ? ? ? ? ? ? 文本文件,其中包含文本內(nèi)容。
- 二進(jìn)制內(nèi)容:如果文件中的二進(jìn)制值代表機(jī)器語(yǔ)言代碼或數(shù)值數(shù)據(jù),圖片或者音樂(lè)編碼,該? ? ? ? ? ? ? ? ? ? ? ?文件就是二進(jìn)制文件,其中包含二進(jìn)制內(nèi)容。
2.標(biāo)準(zhǔn)文件
? c程序自動(dòng)打開(kāi)的三個(gè)文件
- 標(biāo)準(zhǔn)輸入(stdin):為程序提供輸入,getchar()和scanf()使用的文件。
- 標(biāo)準(zhǔn)輸出(stdout):為程序提供輸出,putchar()、printf()和puts()使用的文件。
- 標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr):提供一個(gè)邏輯上不同的地方來(lái)發(fā)送錯(cuò)誤信息。
二,文件的打開(kāi)和關(guān)閉
1.文件指針
每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟了一個(gè)相對(duì)應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的,這個(gè)結(jié)構(gòu)體類型是由系統(tǒng)聲明的取名FILE(文件)。
定義一個(gè)文件指針變量:
FILE * pf ;//文件指針變量,指向被操作的文件
1.1文件的打開(kāi)
? 打開(kāi)文件我們用到一個(gè)打開(kāi)文件的函數(shù) fopen()查找?guī)旌瘮?shù)得知 :
所以我們用文件指針接受打開(kāi)的文件可操作流:
FILE * pf = fopen("文件名.后綴","打開(kāi)方式");
//打開(kāi)文件之后要判斷有沒(méi)有打開(kāi)成功
if(pf==NULL) //打開(kāi)失敗返回NULL
perror("fopen");
//perror報(bào)錯(cuò)函數(shù),會(huì)打印括號(hào)里面的錯(cuò)誤信息
流是一個(gè)高度抽象的概念:
? ? ? ? ?程序直接傳輸?shù)酵獠吭O(shè)備比較繁瑣,所以寫(xiě)入流,讓流操作
?下述所有的流 同時(shí)包括 FILE文件指針pf。
?1.2文件的關(guān)閉
? ? ? 關(guān)閉與流關(guān)聯(lián)的文件并取消關(guān)聯(lián),使用fcloae():
fclose(pf);//關(guān)閉文件
pf=NULL; //置空指針
注意:
- 打開(kāi)文件是有限的,只打開(kāi)不釋放,最后會(huì)打不開(kāi)文件。
- 路徑錯(cuò)誤也會(huì)導(dǎo)致打不開(kāi)文件
- 可以用絕對(duì)路徑打開(kāi)文件,但是要注意轉(zhuǎn)義字符(目錄下的絕對(duì)位置,直接到達(dá)目標(biāo)位置,通常是從盤(pán)符開(kāi)始的路徑)。
? ? ??
三,文件的順序讀寫(xiě)?
? ? ? ?先簡(jiǎn)單介紹所有的讀寫(xiě)函數(shù),然后再附上表格。
? ? ? ?所有用到的pf都表示文件指針。
1.fgetc
從流中獲取字符
參數(shù)是標(biāo)準(zhǔn)輸入流?
? ? ? ? 讀一次向后移動(dòng) 1 ,類似于指針的 ++ ,當(dāng)讀取超出文件長(zhǎng)度 出EOF(-1) ;
int ret = fgetc(pf);
2,fputc
將字符寫(xiě)入流
?兩個(gè)參數(shù)一個(gè)是 字符,一個(gè)是 標(biāo)準(zhǔn)輸出流(stdout,stderr)
fputc('字符',輸出流);
3.fgets
從流中獲取字符串寫(xiě)入目標(biāo)數(shù)組
?
第一個(gè)參數(shù)是 目標(biāo)數(shù)組的指針;
第二個(gè)復(fù)制到數(shù)組的最大個(gè)數(shù)(n-1個(gè),最后一個(gè)放'\0');
第三個(gè)參數(shù)是標(biāo)準(zhǔn)輸入流。
fgets(arr,4,pf);
4.fputs
將字符串寫(xiě)入流
第一個(gè)參數(shù)是要寫(xiě)入流的地址指針;
第二個(gè)參數(shù)是標(biāo)準(zhǔn)輸出流。
fputs("abcdef\n",pf);
5.fprintf
將格式化數(shù)據(jù)寫(xiě)入流
第一個(gè)參數(shù)是標(biāo)準(zhǔn)輸出流
第二個(gè)參數(shù)是格式化字符串等一系列的東西
Typedef struct S{
char arr[10];
int num;
float sc;
}s;
fprintf(pf,"%s %d %d ",s.arr,s.num,s.sc) ;
6.fscanf
從流中讀取格式化數(shù)據(jù)
第一個(gè)參數(shù)是標(biāo)準(zhǔn)輸入流
第二個(gè)參數(shù)是格式化字符串等一系列的東西
fscanf(pf,"%s %d %f",&(s.arr),&(s,num),&(s.sc));
7.fwrite
以二進(jìn)制的方式寫(xiě)文件
第一個(gè)參數(shù)是寫(xiě)入元素?cái)?shù)組的指針
第二個(gè)參數(shù)是要寫(xiě)入的每個(gè)元素的大小(單位字節(jié))
第三個(gè)參數(shù)是要寫(xiě)入的元素個(gè)數(shù)
第四個(gè)參數(shù)是要被寫(xiě)入的地址
fwrite(&s,sizeof(struct S) , 1 ,pf) ;
//從s中找到1個(gè)元素,元素大小是sizeof(struct S)的數(shù)據(jù),寫(xiě)到pf中
8.fread
以二進(jìn)制的方式讀文件
第一個(gè)參數(shù)是接收讀取文件內(nèi)容的地址
第二個(gè)參數(shù)是要讀取文件的大小
第三個(gè)參數(shù)是要讀取文件的個(gè)數(shù)
第四個(gè)參數(shù)是被讀取文件的地址
fread(&s,sizeof(struct S),1,pf);
//從pf里讀取1個(gè)大小為sizeof(struct S)的文件到s中去
?9.表格
函數(shù) | 功能 | 適用于 |
fgetc | 字符輸入函數(shù)(讀文件) | 所有輸入流 |
fputc | 字符輸出函數(shù)(寫(xiě)文件) | 所有輸出流 |
fgets | 文本行輸入函數(shù)(讀一行) | 所有輸入流 |
fputs | 文本行輸出函數(shù)(寫(xiě)一行) | 所有輸出流 |
fscanf | 格式化輸入函數(shù) (讀) | 所有輸入流 |
fprintf | 格式化輸出函數(shù)(寫(xiě)) | 所有輸出流 |
fread | 二進(jìn)制輸入? (讀) | 文件 |
fwrite | 二進(jìn)制輸出? (寫(xiě)) | 文件 |
這里會(huì)有些迷惑,為什么輸出函數(shù)后面會(huì)標(biāo)注 寫(xiě),輸入函數(shù)后面 標(biāo)注 讀 。
這里的讀寫(xiě) 是面向內(nèi)存的,也就是說(shuō)對(duì)于用戶來(lái)說(shuō)的輸入,對(duì)于內(nèi)存來(lái)說(shuō)是讀,就是讀取用戶的輸入信息,或者是別的位置的數(shù)據(jù);對(duì)用戶來(lái)說(shuō)的輸出,對(duì)于內(nèi)存來(lái)說(shuō)是寫(xiě),就是寫(xiě)出信息讓用戶可以看到。
四,文件的隨機(jī)讀寫(xiě)
1,fseek?
根據(jù)文件指針的位置和偏移量來(lái)定位文件指針
第一個(gè)參數(shù) 流
第二個(gè)參數(shù) 偏移量
第三個(gè)參數(shù) 起始位置
起始位置選項(xiàng): SEEK_CUR :文件當(dāng)前位置開(kāi)始
? ? ? ? ? ? ? ? ? ? ? ? ? SEEK_END?: 文件末尾位置開(kāi)始
? ? ? ? ? ? ? ? ? ? ? ? ? SEEK_SET? : 文件起始位置開(kāi)始
?2,ftell
返回文件指針的當(dāng)前位置
?參數(shù)是 流
3,rewind
讓文件指針回到起始位置
?參數(shù)是 流
判斷文件結(jié)束
1,feof
當(dāng)文件讀取結(jié)束時(shí),判斷文件是讀取失敗結(jié)束,還是遇到文件尾(讀取完成)結(jié)束。
2,判斷結(jié)束
判斷結(jié)束不可以用feof的返回值直接判斷文件是否結(jié)束,但可以通過(guò)以下幾種方式:
- fgets 判斷返回值是否為 EOF
- fgets 判斷返回值是否為NULL
- fread判斷返回值是否小于實(shí)際要讀取的個(gè)數(shù)
文件使用模式(表格)
文件使用方式 | 含義 | 如果指定文件不存在 |
" r "? ? ?(只讀) | 為了輸入數(shù)據(jù),打開(kāi)一個(gè)已經(jīng)存在的文本文件 | 出錯(cuò) |
" w "? ? (只寫(xiě)) | 為了輸出數(shù)據(jù),打開(kāi)一個(gè)文本文件 | 建立一個(gè)新的文件 |
" a "? ? ?(追加) | 向文本文件尾部添加數(shù)據(jù) | 建立一個(gè)新的文件 |
" rb "? ? (只讀) | 為了輸入數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 | 出錯(cuò) |
" wb "? ?(只寫(xiě)) | 為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件 | 建立一個(gè)新的文件 |
" ab "? ? (追加) | 向一個(gè)二進(jìn)制文件尾部添加數(shù)據(jù) | 出錯(cuò) |
" r+? "? ? (讀寫(xiě)) | 為了讀寫(xiě),打開(kāi)一個(gè)文本文件 | 出錯(cuò) |
" w+ "? ?(讀寫(xiě)) | 為了讀寫(xiě),建立一個(gè)新的文本文件 | 建立一個(gè)新的文件 |
" a+ "? ? (讀寫(xiě)) | 打開(kāi)一個(gè)文件,在文件尾部進(jìn)行讀寫(xiě) | 建立一個(gè)新的文件 |
"rb+? "? ?(讀寫(xiě)) | 打開(kāi)一個(gè)二進(jìn)制文件(讀寫(xiě)) | 出錯(cuò) |
" wb+ "? (讀寫(xiě)) | 建立一個(gè)新的二進(jìn)制文件(讀寫(xiě)) | 建立一個(gè)新的文件 |
" ab+ "? (讀寫(xiě)) | 打開(kāi)一個(gè)二進(jìn)制文件,在文件尾部進(jìn)行讀和寫(xiě) | 建立一個(gè)新的文件 |
" wx " ," wbx " , " w+x " , " wb+x " 或 " w+bx "
類似于不含有x的模式,如果文件已經(jīng)存在或以獨(dú)占模式被打開(kāi),則打開(kāi)文件失敗文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-495076.html
文本文件的部分代碼示例
int c; //處理EOF,EOF的值是-1,不可以用 char類型
FILE *pf = fopen("test.c","r") ;//這里的文件名知識(shí)一個(gè)例子
if(!pf)//判斷打開(kāi)文件是否成功
{
perror("FILE error");
return EXIT_FAILURE;//值為1, 運(yùn)行程序失敗
}
//fgetc讀取失敗時(shí)或者遇到文件結(jié)尾時(shí)返回EOF
while((c = fgetc(pf) ) != EOF)
{
putchar(c);
}
//判斷結(jié)束原因
if(ferror(pf))
{
printf("I/O error");
}
else if(feof(pf) ) //前一個(gè)沒(méi)有出現(xiàn)錯(cuò)誤說(shuō)明是正常結(jié)束
{
printf("END of FILE ……");
}
//ferroe 初始化為0 ,返回非0 的時(shí)表面出錯(cuò)
//關(guān)閉文件
fclose(pf);
二進(jìn)制文件的部分代碼
enum {
size = 5
};
//枚舉 ,后面的size大小是5
double a[size] = { 1,2,3,4,5 };
FILE * pf = fopen("test.c", "wb"); //打開(kāi)文件
fwrite(a, sizeof(a), size, pf); //fwirte的返回值是一個(gè)size_t類型
fclose(pf);//關(guān)閉文件
double b[size];
FILE * pf = fopen("test.c", "rb");
size_t ret = fread(b, sizeof(b), size, pf);//讀取
if(ret == 1) //當(dāng)ret == 1 時(shí),讀取成功
{
puts("successfully :");
for (int n = 0; n < size; n++)//打印內(nèi)容
{
printf("%f ",b[n]);
}
putchar('\n');
}
else //失敗時(shí)判斷失敗的原因
{
if (feof(pf))
{
printf("end of file:");
}
else if (ferror(pf))
{
perror("Error:");
}
}
fclose(pf);//關(guān)閉文件
上述兩個(gè)代碼段,需要放到具體內(nèi)容里,用合適的變量接受具體的返回值,返回值類型上文都有介紹。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-495076.html
到了這里,關(guān)于C語(yǔ)言文件的讀寫(xiě)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!