前言
在C語言中,文件操作是一項(xiàng)重要的任務(wù)。通過文件操作,我們可以讀取和寫入文件的內(nèi)容,實(shí)現(xiàn)數(shù)據(jù)的長(zhǎng)期存儲(chǔ)和共享。文件操作不僅可以用于文本文件,還可以用于二進(jìn)制文件、配置文件等各種類型的文件。
這篇文章中,我們將深入探討C語言文件操作的各個(gè)方面,介紹常用的文件操作函數(shù)和技巧,幫助讀者更好地理解和應(yīng)用文件操作。無論是初學(xué)者還是有一定經(jīng)驗(yàn)的開發(fā)者,都能從中獲得實(shí)用的知識(shí)和技能,為自己的C語言編程之路增添新的可能性。
一、文件類型
1. 程序文件
?程序文件是包含C源代碼的文件,它們經(jīng)過編譯和鏈接后可以生成可執(zhí)行程序。程序文件中定義了變量、函數(shù)、結(jié)構(gòu)體等程序元素,通過編寫相應(yīng)的代碼實(shí)現(xiàn)所需的功能。在程序文件中,我們可以使用各種控制結(jié)構(gòu)、輸入輸出函數(shù)和庫(kù)函數(shù)來操作和處理數(shù)據(jù)。
2. 數(shù)據(jù)文件
?數(shù)據(jù)文件是包含實(shí)際數(shù)據(jù)的文件,可以是文本文件或二進(jìn)制文件。文本文件以可讀的文本形式存儲(chǔ)數(shù)據(jù),可以使用標(biāo)準(zhǔn)的輸入輸出函數(shù)(如printf和scanf)來讀取和寫入文本文件。二進(jìn)制文件以二進(jìn)制形式存儲(chǔ)數(shù)據(jù),一般需要使用專門的讀寫函數(shù)進(jìn)行處理。
PS.文件名
一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴。 例如: c:\code\test.txt
為了方便起見,文件標(biāo)識(shí)常被稱為文件名。
二、文件的打開和關(guān)閉
1. 文件指針
文件指針是C語言中用于定位和訪問文件的機(jī)制。它是一個(gè)特殊的變量,用來指示當(dāng)前操作的位置或位置的偏移量。通過文件指針,我們可以進(jìn)行讀寫操作,并在文件中移動(dòng)指針的位置。
每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名FILE.
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
不同的C編譯器的FILE類型包含的內(nèi)容不完全相同,但是大同小異
文件指針的位置決定了下一次讀寫操作的位置。例如,在讀取文件內(nèi)容時(shí),每次讀取前文件指針會(huì)自動(dòng)后移,以便下次讀取從下一個(gè)位置開始。
另外,文件指針還有幾個(gè)重要的特殊位置:
-
文件起始位置(0):文件打開后,文件指針通常位于文件起始位置,即偏移量為0的位置。
-
文件末尾位置(EOF):表示文件的結(jié)尾,文件指針在讀取到文件末尾時(shí)會(huì)自動(dòng)停止讀取操作。
-
文件錯(cuò)誤位置(NULL):在發(fā)生錯(cuò)誤時(shí),文件指針可能為NULL,表示無法繼續(xù)操作文件。
在使用文件指針時(shí),我們需要注意一些常見的問題。首先,操作文件前必須確保文件已經(jīng)成功打開,并在使用完畢后及時(shí)關(guān)閉文件,以便釋放資源。其次,應(yīng)注意異常情況的處理,如文件不存在、權(quán)限不足等,以避免程序崩潰或產(chǎn)生錯(cuò)誤結(jié)果。
2. 文件的打開和關(guān)閉
文件的打開和關(guān)閉是文件處理中非常重要的操作。在進(jìn)行文件讀寫時(shí),必須先打開文件,然后進(jìn)行讀寫操作,最后再關(guān)閉文件。這樣做可以避免文件資源泄漏和數(shù)據(jù)損壞等問題。
在C語言中,文件的打開和關(guān)閉可以通過文件操作函數(shù)來實(shí)現(xiàn)。其中,常用的文件操作函數(shù)包括fopen
、fclose
等。下面是一個(gè)基本的文件打開和關(guān)閉的示例:
#include <stdio.h>
int main()
{
FILE *fp;
char filename[20];
// 打開文件
printf("請(qǐng)輸入要打開的文件名:");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件打開失??!\n");
return 1;
}
printf("文件打開成功!\n");
// 文件讀取或?qū)懭氩僮鳌?/span>
// 關(guān)閉文件
fclose(fp);
printf("文件已關(guān)閉!\n");
return 0;
}
上述代碼中,我們首先定義了一個(gè)指向文件的指針(FILE *fp
),然后通過fopen
函數(shù)打開文件。fopen
函數(shù)的第一個(gè)參數(shù)是文件名或路徑(字符串類型),第二個(gè)參數(shù)是打開文件的模式(字符串類型)。文件打開模式包括:
文件使用方式 | 含義 | 如果指定文件不存在 |
---|---|---|
“r” (只讀) | 為了輸入數(shù)據(jù),打開一個(gè)已經(jīng)存在的文本文件 | 出錯(cuò) |
“w” (只寫) | 為了輸出數(shù)據(jù),打開一個(gè)文本文件 | 建立一個(gè)新的文件 |
“a” (追加) | 向文本文件尾添加數(shù)據(jù) | 建立一個(gè)新的文件 |
“rb” (只讀) | 為了輸入數(shù)據(jù),打開一個(gè)二進(jìn)制文件 | 出錯(cuò) |
“wb” (只寫) | 為了輸出數(shù)據(jù),打開一個(gè)二進(jìn)制文件 | 建立一個(gè)新的文件 |
“ab” (追加) | 向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù) | 出錯(cuò) |
“r+” (讀寫) | 為了讀和寫,打開一個(gè)文本文件 | 出錯(cuò) |
“w+” (讀寫) | 為了讀和寫,建議一個(gè)新的文件 | 建立一個(gè)新的文件 |
“a+” (讀寫) | 打開一個(gè)文件,在文件尾進(jìn)行讀寫 | 建立一個(gè)新的文件 |
“rb+” (讀寫) | 為了讀和寫打開一個(gè)二進(jìn)制文件 | 出錯(cuò) |
“wb+” (讀寫) | 為了讀和寫,新建一個(gè)新的二進(jìn)制文件 | 建立一個(gè)新的文件 |
“ab+” (讀寫) | 打開一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫 | 建立一個(gè)新的文件 |
在打開文件后,我們可以進(jìn)行讀寫操作。最后通過fclose
函數(shù)關(guān)閉文件,以釋放資源。如果在打開文件時(shí)出現(xiàn)錯(cuò)誤,則返回的指針為NULL
,需要進(jìn)行錯(cuò)誤處理。
三、文件的順序讀寫
當(dāng)打開文件時(shí),可以通過指定不同的訪問模式來控制文件讀寫的方式。在選擇讀寫模式后,就可以使用文件指針進(jìn)行讀寫操作。
?常見的讀寫函數(shù)有:
功能 | 函數(shù)名 | 適用于 |
---|---|---|
字符輸入 | fgetc | 所有輸入流 |
字符輸出 | fputc | 所有輸出流 |
文本行輸入 | fgets | 所有輸入流 |
文本行輸出 | fputs | 所有輸出流 |
格式化輸入 | fscanf | 所有輸入流 |
格式化輸出 | fprintf | 所有輸出流 |
二進(jìn)制輸入 | fread | 文件 |
二進(jìn)制輸出 | fwrite | 文件 |
下面是一個(gè)示例代碼,用于在文本文件中按順序讀取和寫入數(shù)據(jù):
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
char str[255];
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
// 讀取每一行并輸出
while (fgets(str, 255, fp) != NULL) {
printf("%s", str);
}
fclose(fp);
// 向文件中寫入數(shù)據(jù)
fp = fopen("example.txt", "a");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
fprintf(fp, "This is a new line\n");
fclose(fp);
return 0;
}
該示例程序首先以只讀模式打開文件 example.txt
,然后使用 fgets
函數(shù)按照行讀取數(shù)據(jù)并輸出。接著,它再以追加模式打開同一個(gè)文件,并使用 fprintf
函數(shù)向文件中寫入一行新數(shù)據(jù)。
四、文件的隨機(jī)讀寫
1. fseek() 函數(shù)
fseek
是一個(gè)用于設(shè)置文件指針位置的函數(shù)。它的原型如下:
int fseek(FILE *stream, long offset, int origin);
參數(shù)說明:
-
stream
:指向要設(shè)置位置的文件流的指針。 -
offset
:要添加到或減去當(dāng)前位置的字節(jié)數(shù),可以是正數(shù)或負(fù)數(shù)。 -
origin
:用于確定offset
如何解釋的常量。可以使用以下值之一:- SEEK_SET:從文件開頭開始計(jì)算偏移量。
- SEEK_CUR:從當(dāng)前位置開始計(jì)算偏移量。
- SEEK_END:從文件末尾開始計(jì)算偏移量。
返回值為 0 表示成功,非零值表示出錯(cuò)。
使用 fseek
可以將文件指針定位到文件中的任意位置進(jìn)行讀寫操作。例如,要將文件指針定位到文件開頭,可以使用如下代碼:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
// 將文件指針設(shè)置到文件開頭
fseek(fp, 0, SEEK_SET);
// 在此處進(jìn)行讀取操作
fclose(fp);
在上述代碼中,我們打開了一個(gè)名為 example.txt
的文件,并將文件指針通過 fseek
函數(shù)定位到了文件的開頭位置。
2. ftell() 函數(shù)
ftell
是一個(gè)用于獲取文件指針當(dāng)前位置的函數(shù)。它的原型如下:
long ftell(FILE* stream);
參數(shù) stream
是指向要獲取當(dāng)前位置的文件流的指針。返回值是當(dāng)前位置相對(duì)于文件開頭的字節(jié)數(shù)(偏移量)。
以下是一個(gè)示例代碼,演示了如何使用 ftell
函數(shù)獲取文件指針的當(dāng)前位置:
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
// 定位到文件第6個(gè)字節(jié)的位置
fseek(fp, 5, SEEK_SET);
// 獲取文件指針的當(dāng)前位置
long position = ftell(fp);
printf("Current position: %ld\n", position);
fclose(fp);
return 0;
}
在上述示例中,我們首先打開一個(gè)名為 example.txt
的文件,并使用 fseek
將文件指針定位到文件的第6個(gè)字節(jié)處。然后,通過調(diào)用 ftell
函數(shù)獲取文件指針的當(dāng)前位置,并將其打印出來。
????注意:ftell
返回的是一個(gè) long
類型的值,表示當(dāng)前位置相對(duì)于文件開頭的字節(jié)數(shù)。如果發(fā)生錯(cuò)誤,ftell
可能會(huì)返回一個(gè)特殊的值 EOF
(-1)。因此,在使用 ftell
的結(jié)果時(shí),應(yīng)該先檢查是否出錯(cuò)。
3. rewind() 函數(shù)
rewind
是一個(gè)用于將文件指針重新定位到文件開頭的函數(shù)。它的原型如下:
void rewind(FILE *stream);
參數(shù) stream
是指向要重新定位的文件流的指針。rewind
函數(shù)會(huì)將文件指針移動(dòng)到文件開頭,即相當(dāng)于調(diào)用 fseek(stream, 0, SEEK_SET)
。
以下是一個(gè)示例代碼,演示了如何使用 rewind
函數(shù)將文件指針重新定位到文件開頭:
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("Error opening file\n");
return -1;
}
// 將文件指針重新定位到文件開頭
rewind(fp);
// 在此處進(jìn)行讀取操作
fclose(fp);
return 0;
}
在上述示例中,我們打開一個(gè)名為 example.txt
的文件,然后使用 rewind
將文件指針重新定位到文件開頭。這樣,在之后的讀取操作中,可以從文件的開頭開始讀取數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-715290.html
總結(jié)
本文介紹了 C 語言中文件操作的基礎(chǔ)知識(shí),包括文件類型、文件的打開和關(guān)閉、文件的順序讀寫和隨機(jī)讀寫等。文章首先將文件分為程序文件和數(shù)據(jù)文件兩種類型,并簡(jiǎn)要說明了它們的區(qū)別以及命名方式。接下來,文章詳細(xì)講解了文件的打開和關(guān)閉過程,包括如何使用文件指針和相關(guān)函數(shù)打開文件、關(guān)閉文件,以及處理錯(cuò)誤情況。在講解完文件的基礎(chǔ)操作后,文章介紹了文件的順序讀寫和隨機(jī)讀寫兩種方式,并提供了相應(yīng)的函數(shù)及示例代碼進(jìn)行演示。其中,隨機(jī)讀寫部分還詳細(xì)介紹了 fseek()、ftell() 和 rewind() 等函數(shù)的用法。文章來源地址http://www.zghlxwxcb.cn/news/detail-715290.html
到了這里,關(guān)于C語言中的文件操作指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!