文章目錄
- 一、檔案的基礎知識
- 1.什么是檔案
- 2.檔案名
- 3.檔案型別
- 4.檔案指標
- 二、檔案操作函式
- 1.檔案的打開和關閉
- 2.檔案的順序讀寫
- (1)fputc,fgetc
- (2)fputs,fgets
- 3.檔案的隨機讀寫
- (1)fseek
- (2)rewind
- 感謝閱讀,如有錯誤請批評指正
一、檔案的基礎知識
1.什么是檔案
磁盤上的檔案是檔案,但是在程式設計中,一般認為檔案有兩種:程式檔案、資料檔案,
程式檔案:包括源程式檔案(后綴為.c),目標檔案(windows環境后綴為.obj),可執行程式(windows環境后綴為.exe),
資料檔案:檔案的內容不一定是程式,而是程式運行時讀寫的資料,如程式運行需要從中讀取資料的檔案,或者輸出內容的檔案,
本文討論的是資料檔案,
2.檔案名
一個檔案要有一個唯一的檔案標識,以便用戶識別和參考,
檔案名包含3部分:檔案路徑+檔案名主干+檔案后綴,
例如: c:\code\test.txt
這里c:\code\為檔案路徑,test為檔案主干,txt為檔案后綴,
為了方便起見,檔案標識常被稱為檔案名,
3.檔案型別
根據資料的組織形式,資料檔案被分為文本檔案或者二進制檔案,
資料在記憶體中以二進制的形式存盤,如果不加轉換的輸出到外存,就是二進制檔案,
如果要求在外存上以ASCII碼的形式存盤,則需要在存盤前轉換,以ASCII字符的形式存盤的檔案就是文本檔案,
一個資料在記憶體中是怎么存盤的呢?
字符一律以ASCII形式存盤,數值型資料既可以用ASCII形式存盤,也可以使用二進制形式存盤,
如有整數10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占用5個位元組(每個字符一個位元組),存盤的內容依次為’1’, ‘0’, ‘0’, ‘0’, ‘0’(注意這里是字符0,而不是數字0)
而二進制形式輸出,則在磁盤上只占4個位元組(VS2013測驗),

運行下面的代碼,用二進制編譯器打開in.txt,
(其中的檔案操作函式會在下文具體講到)
代碼如下(示例):
int main()
{
int a = 10000;
FILE* pf = fopen("in.txt", "wb");
fwrite(&a, 4, 1, pf);
fclose(pf);
pf = NULL;
return 0;
}

此處16進制的00 00 27 10,即為10進制下的10000,
4.檔案指標
緩沖檔案系統中,關鍵的概念是“檔案型別指標”,簡稱“檔案指標”,
每個被使用的檔案都在記憶體中開辟了一個相應的檔案資訊區,用來存放檔案的相關資訊(如檔案的名字,檔案狀態及檔案當前的位置等,本質是一個結構體),這些資訊是保存在一個結構體變數中的,該結構體型別是有系統宣告的,取名FILE,
例如,VS2013編譯環境提供的 stdio.h 頭檔案中有以下的檔案型別申明:

每當打開一個檔案的時候,系統會根據檔案的情況自動創建一個FILE結構的變數,并填充其中的資訊,
一般都是通過一個FILE的指標來維護這個FILE結構的變數,這樣使用起來更加方便,
二、檔案操作函式
1.檔案的打開和關閉
檔案在讀寫之前應該先打開檔案,在使用結束之后應該關閉檔案,
在撰寫程式的時候,在打開檔案的同時,都會回傳一個FILE*的指標變數指向該檔案,也相當于建立了指標和檔案的關系,
ANSIC 規定使用fopen函式來打開檔案,fclose來關閉檔案,
//檔案名 打開方式
FILE * fopen ( const char * filename, const char * mode );
//檔案指標
int fclose ( FILE * stream );
檔案的打開方式有很多種,這里介紹常用的幾種
(1)“r”:只讀,即打開檔案并從檔案中讀內容,如果指定的檔案不存在會報錯,
(2)“w”:只寫,即打開檔案并向檔案中輸入內容,如果指定的檔案不存在會自動創建一個新的檔案,
(3)“a”:追加,即打開檔案并向檔案末尾添加內容,如果指定的檔案不存在會報錯,
(4)“rb”:只讀,即打開二進制檔案并從檔案中讀內容,如果指定的檔案不存在會報錯,
(5)“wb”:只寫,即打開二進制檔案并向檔案中輸入內容,如果指定的檔案不存在會自動創建一個新的文件,
2.檔案的順序讀寫
(1)fputc,fgetc
fputc原型:
int fputc(int c, FILE *stream);
運行下面的程式:
代碼如下(示例):
int main()
{
FILE* pf = fopen("in.txt", "w");
fputc('a', pf);
fputc('b', pf);
fputc('c', pf);
fclose(pf);
return 0;
}
可以看到"in.txt"中已經依次寫入了’a’,‘b’,'c’三個字符
代碼如下(示例):

這時再用fgetc函式可依次得到檔案中的字符,
fgetc原型
int fgetc(FILE *stream);
代碼如下(示例):
int main()
{
FILE* pf = fopen("in.txt", "r");
printf("%c\n", fgetc(pf));
printf("%c\n", fgetc(pf));
printf("%c\n", fgetc(pf));
fclose(pf);
return 0;
}

(2)fputs,fgets
fputs原型
int fputs(const char *string, FILE *stream);
代碼如下(示例):
int main()
{
FILE* pf = fopen("in.txt", "w");
char* s = "hello world";
fputs(s, pf);//將s中的內容輸出到pf指向的檔案中
fclose(pf);
return 0;
}
運行結果如下,此時"in.txt"已經寫入了"hello world",

fgets原型:
char* fgets(char* string, int n, FILE* stream);
即從stream流中讀入資料到string中,一次最多讀n-1個(因為最后一個字符應該被置為’\0’),
代碼如下(示例):
int main()
{
FILE* pf = fopen("in.txt", "r");
char s[1024] = { 0 };
fgets(s, 1023, pf);
printf("%s\n", s);
fclose(pf);
return 0;
}

3.檔案的隨機讀寫
(1)fseek
函式原型如下:
int fseek ( FILE * stream, long int offset, int origin );
//偏移量 起始位置
引數中的offset可以為負值,表示負向偏移
第三個引數origin設定從檔案的哪里開始偏移,可能取值為:
SEEK_SET: 檔案開頭
SEEK_CUR: 當前位置
SEEK_END: 檔案結尾
這個函式是用來定位函式指標的,定位好位置后,可用順序讀寫的函式讀或寫內容,
代碼如下(示例):
int main()
{
//in.txt中的內容為hello world
FILE* pf = fopen("in.txt", "r");
fseek(pf, 4, SEEK_SET);//將檔案指標從檔案開頭向后4個位置
printf("%c\n", fgetc(pf));
fclose(pf);
return 0;
}

(2)rewind
該函式可讓檔案指標回到檔案的起始位置
函式原型為
void rewind ( FILE * stream );
代碼如下(示例):
int main()
{
FILE* pf = fopen("in.txt", "r");
fseek(pf, 4, SEEK_SET);
printf("%c\n", fgetc(pf));
rewind(pf);
printf("%c\n", fgetc(pf));
fclose(pf);
return 0;
}

感謝閱讀,如有錯誤請批評指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272277.html
標籤:其他
上一篇:記錄資料結構的學習——復雜度
下一篇:排序演算法總結
