C語言全面梳理文件操作方法
1.什么是文件
我們先從基本概念入手,內(nèi)存中存放的數(shù)據(jù)在計算機(jī)關(guān)機(jī)后就會消失。要長久保存數(shù)據(jù),就要使用硬盤、光盤、U 盤等設(shè)備。為了便于數(shù)據(jù)的管理和檢索,引入了“文件”的概念。一篇文章、一段視頻、一個可執(zhí)行程序,都可以被保存為一個文件,并賦予一個文件名。操作系統(tǒng)以文件為單位管理磁盤中的數(shù)據(jù)。
1.1程序文件
包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。
1.2數(shù)據(jù)文件
文件的內(nèi)容不一定是程序,而是程序運(yùn)行時讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。
1.3文件名
一個文件要有一個唯一的文件標(biāo)識,以便用戶識別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如: c:\code\test.txt
為了方便起見,文件標(biāo)識常被稱為文件名
2.為什么使用文件
當(dāng)我們想把數(shù)據(jù)在計算機(jī)上保留下來,只有自己主動清理的時候才不復(fù)存在時我們加需要將數(shù)據(jù)保存在磁盤上,就需要用文件的方式。
這篇文章主要討論數(shù)據(jù)文件
3.文件的打開和關(guān)閉
3.1文件指針
當(dāng)我們想要打開一個文件是就會用用到文件指針。每個被使用的文件都在內(nèi)存中開辟了一個相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE。每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。
一般都是通過一個FILE的指針來維護(hù)這個FILE結(jié)構(gòu)的變量,這樣使用起來更加方便
FILE* pf//文件指針變量
定義pf是一個指向FILE類型數(shù)據(jù)的指針變量??梢允筽f指向某個文件的文件信息區(qū)(是一個結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。
3.2文件的打開和關(guān)閉
在文件的打開和關(guān)閉中我們需要用到兩個庫函數(shù),fopen和fclose,因?yàn)樵贏NSIC 規(guī)定使用fopen函數(shù)來打開文件,fclose來關(guān)閉文件。當(dāng)我們打開文件過后我們需要判斷一下時候打開文件成功才能進(jìn)行下一步操作,等操作完畢后關(guān)閉文件,在使用fopen的時候需注意的是我們需要兩個參數(shù),一個是文件名,一個是打開方式。打開方式圖標(biāo)和代碼演示如下。
文件使用方式 | 含義 | 如果指定文件不存在 |
---|---|---|
"r"(只讀) | 為了輸入數(shù)據(jù),打開一個已經(jīng)存在的文本文件 | 出錯 |
"w"(只寫) | 為了輸出數(shù)據(jù),打開一個文本文件 | 建立一個新的文件 |
"a"(追加) | 向文本文件尾添加數(shù)據(jù) | 建立一個新的文件 |
"rb"(只讀) | 為了輸入數(shù)據(jù),打開一個二進(jìn)制文件 | 出錯 |
"wb"(只寫) | 為了輸出數(shù)據(jù),打開一個二進(jìn)制文件 | 建立一個新文件 |
"ab"(追加) | 向一個二進(jìn)制文件尾添加數(shù)據(jù) | 出錯 |
"r+"(讀寫) | 為了讀和寫,打開一個文本文件 | 出錯 |
"w+"(讀寫) | 為了讀和寫,建立一個新的文件 | 建立一個新的文件 |
"a+"(讀寫) | 打開一個文件,在文件尾進(jìn)行讀寫 | 建立一個新的文件 |
"rb+"(讀寫) | 為了讀和寫打開一個二進(jìn)制文件 | 出錯 |
"wb+"(讀寫) | 為了讀和寫,新建一個新的二進(jìn)制文件 | 建立一個新的文件 |
"ab+"(讀寫) | 打開一個二進(jìn)制文件,在文件尾進(jìn)行讀和寫 | 建立一個新的文件 |
#include<stdio.h> int main() { //打開文件 FILE* pf = fopen("test.txt","w")//w代表write,表示寫文件 //判斷文件是否打開 if(pf == NULL) { perror("fopen");//打開失敗返回錯誤信息 return; } //寫文件 //關(guān)閉文件 fclose(pf); pf=NULL; return 0; }
4.文件的順序讀寫
在對文件進(jìn)行一些順序讀寫的時候我們需要用到一些功能函數(shù)如下:
功能 | 函數(shù)名 | 適用于 |
---|---|---|
字符輸入函數(shù) | fgetc | 所有輸入流 |
字符輸出函數(shù) | fputc | 所有輸出流 |
文本行輸入函數(shù) | fgets | 所有輸入流 |
文本行輸出函數(shù) | fputs | 所有輸出流 |
格式化輸入函數(shù) | fscanf | 所有輸入流 |
格式化輸出函數(shù) | fprintf | 所有輸出流 |
二進(jìn)制輸入 | fread | 文件 |
二進(jìn)制輸出 | fwrite | 文件 |
什么是流
流是個抽象的概念,是對輸入輸出設(shè)備的抽象。設(shè)備可以是文件,網(wǎng)絡(luò),內(nèi)存等。流具有方向性,至于是輸入流還是輸出流則是一個相對的概念,一般以程序?yàn)閰⒖?,如果?shù)據(jù)的流向是程序至設(shè)備,我們成為輸出流,反之我們稱為輸入流。可以將流想象成一個“水流管道”,水流就在這管道中形成了,自然就出現(xiàn)了方向的概念。
相對于編譯器來說 輸入:將文件中的數(shù)據(jù)拿出來 輸出:將數(shù)據(jù)放入文件中
這里用代碼給大家演示一下輸入與輸出:
int main() { //打開文件 FILE* pf = fopen("test.txt", "w");//寫 if (pf == NULL) { perror("fopen"); return; } //寫如abcd fputc('a', pf); fputc('b', pf); fputc('c', pf); fputc('d', pf); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
那么現(xiàn)在文件里已經(jīng)有數(shù)據(jù)了(“abcde”),我們想把數(shù)據(jù)拿出來呢?我們就要用到輸入。代碼演示如下:
int main() { FILE* pf = fopen("test.txt", "r");//讀 if (pf == NULL) { perror("fopen"); return; } //拿出字符a int ch = fgetc(pf); printf("%c\n", ch); fclose(pf); pf = NULL; return 0; }
當(dāng)我們讀了字符'a'過后,偏移量從0變到1,這就叫順序讀寫。
這里我們對比一組函數(shù):
scanf - 格式化的輸入函數(shù)
printf - 格式化的輸出函數(shù)
fscanf - 針對所有輸入流的格式化的輸入函數(shù)
fprintf - 針對所有輸出流的格式化輸出函數(shù)
sscanf - 把一個字符串轉(zhuǎn)換成格式化的數(shù)據(jù)
sprintf - 把一個格式化的數(shù)據(jù)轉(zhuǎn)換成字符串
5.文件的隨機(jī)讀寫
5.1fseek
fseek是根據(jù)文件指針位置和偏移量來定位文件指針的函數(shù)
int fseek ( FILE * stream, long int offset, int origin ); // offset - 偏移量 // origin表示如下: //1.SEEK_CUR - 文件指針當(dāng)前的位置 //2.SEEK_END - 文件末尾的位置 //3.SEEK_SET - 文件開始的位置
我們采用上面的列子,在文件中輸入了"abcd",我們想找到 'c' 該怎么做呢代碼演示:
int main() { //打開文件 FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return; } //寫文件 fseek(pf, 2, SEEK_CUR);//c相對于文件當(dāng)前位置的的偏移量為2 int ch = fgetc(pf); printf("%c\n", ch); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
5.2ftell
返回文件相對于起始位置的偏移量,返回的數(shù)據(jù)類型為long
long int ftell ( FILE * stream );
用法很簡單,用上面的例子來給大家講解,我們首先將使用fseek函數(shù)將偏移量改到2,隨后用fgetc函數(shù)后,偏移量向后移,目前偏移量應(yīng)該是3.
int main() { //打開文件 FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return; } //寫文件 fseek(pf, 2, SEEK_CUR);//c相對于文件當(dāng)前位置的的偏移量為2 int ch = fgetc(pf); printf("%c\n", ch); //重置偏移量 long pos = ftell(pf);//3 printf("%d\n",pos); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
5.3rewind
讓文件指針的位置回到文件的起始位置
void rewind ( FILE * stream );
int main() { //打開文件 FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return; } //寫文件 fseek(pf, 2, SEEK_CUR);//c相對于文件當(dāng)前位置的的偏移量為2 int ch = fgetc(pf); printf("%c\n", ch); long pos = ftell(pf); printf("%d\n", pos); //重置偏移量 rewind(pf); pos = ftell(pf); printf("%d\n", pos); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
到此這篇關(guān)于C語言全面梳理文件操作方法的文章就介紹到這了,更多相關(guān)C語言文件操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt結(jié)合OpenCV部署yolov5的實(shí)現(xiàn)
本文主要介紹了Qt結(jié)合OpenCV部署yolov5的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04c語言獲取用戶輸入字符串是scanf和gets的區(qū)別詳解
今天小編就為大家分享一篇c語言獲取用戶輸入字符串是scanf和gets的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07C語言 模擬實(shí)現(xiàn)strcpy與strcat函數(shù)詳解
這篇文章主要介紹了怎樣用C語言模擬實(shí)現(xiàn)strcpy與strcat函數(shù),strcpy()函數(shù)是C語言中的一個復(fù)制字符串的庫函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接2022-04-04