c語言 --- 文件操作

以前在沒學習c語言的時候,如果有人問我,什麼是文件的話,我會這樣回答,文件就是存儲在磁盤上的一些數據。。。好像有點說得過去。當學習了之後對文件進行了如下的總結:
什麼是文件

  • 在程序設計中,我們談的文件有兩種:程序文件、數據文件
  • 程序文件:包括源程序文件(後綴爲.c),目標文件(windows環境下的後綴爲.obj),可執行程序(windows環境下的後綴爲.exe)
  • 數據文件:文件中的內容不一定是程序,而是程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文件,或者輸出內容的文件。

在之前處理數據的時候,輸入輸出都是以終端爲對象的,即從終端的鍵盤上輸入數據,運行結果顯示到顯示器上。其實有時候我們會把信息輸出到磁盤上,當需要的時候再從磁盤上把數據讀取到內存中使用,這樣處理的就是磁盤上的文件。

一.文件名+類型

1.文件名包含三個部分:文件路徑 + 文件名主幹 + 文件後綴
例如:D:\code\test.txt
爲了方便起見,文件標識常被稱爲文件名。
2.文件類型

  • (1)根據數據的組織形式,數據文件被稱爲文本文件或者是二進制文件。
  • (2)數據在內存中以二進制的形式存儲的話,如果不加轉換的輸出到外存,就是二進制文件。
  • (3)如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前進行轉換,以ASCII碼形式存儲的文件就是文本文件

一個數據在內存中是怎麼樣存儲的?
字符一律用ASCII碼的形式進行存儲,數值型類型既可以用ASCII形式存儲,也可以使用二進制的形式存儲。
例如:整數10000,如果在以SACII碼的形式存儲,則在磁盤中佔用5個字節,而二進制形式輸出的話,在磁盤中佔據4個字節。
在這裏插入圖片描述

#include<stdio.h>
int main()
{
	int a = 10000;
	FILE* pf = fopen("test.txt", "yj");
	fwrite(&a, 4, 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

二.文件緩衝區

ANSIC(美國國家標準協會及國際標準化組織)標準採用“緩存文件系統”處理的數據文件,所謂緩衝文件系統是指系統自動地在內存中爲程序中的每一個正在使用的文件開闢一塊“文件緩衝區”。從內存向磁盤輸出數據會先送到內存的緩衝區中,裝滿緩衝區後才一起送到磁盤上。如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩衝區,然後再從緩衝區中逐個的將數據送到程序數據區(程序變量)。

在這裏插入圖片描述

三.文件指針

緩衝文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。
每一個被使用的文件都在內存中開闢了一個相應的文件信息區,用來存放文件的相關信息(如文件的名字,文件的狀及文件當前的位置)。這些信息是保存在一個結構體變量中,該結構體類型是有系統聲明的,取名爲FILE。

struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;

不同的編譯器的FILE類型包含的內容不完全相同,但是大同小異。
每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量。並填充其中的信息,使用者不必關心細節。
一般都是通過一個FILE指針來維護這個FILE結構的變量,這樣使用起來更加的方便。

FILE* pf ; //文件指針變量

定義pf是一個只想FILE類型數據的指針變量。可以使pf只想某個文件的文件信息區(是一個結構體變量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量就能夠找到與它相關聯的文件。

四.文件的打開和關閉

文件在讀寫之前應該先打開文件,在使用結束之後應該關閉文件。
在編寫程序的時候,在打開文件的同時,都會返回一個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”(只寫):爲了輸入數據,打開一個二進制文件,如果文件不存在建立一個新的文件
  • 6.“ab”(追加):向一個二進制文件尾添加數據,如果文件不存在出錯
  • 7.“r+”(讀寫):爲了讀和寫,打開一個文本文件,如果文件不存在出錯
  • 8.“w+”(讀寫):爲了讀和寫,建立一個新的文件,如果文件不存在建立一個新的文件
  • 9.“a+”(讀寫):打開一個文件,在文件尾進行讀寫,如果文件不存在建立一個新的文件
  • 10.“rb”(讀寫):爲了讀和寫打開一個二進制文件,如果文件不存在出錯
  • 11.“wb+”(讀寫):爲了讀和寫,新建一個新的二進制文件,如果文件不存在建立一個新的二進制文件
  • 12.”ab+“(讀寫):打卡一個二進制文件,在文件尾進行讀和寫,如果文件不存在建立一個新的文件。

五.文件的隨機讀寫

fseek:

根據文件指針的位置和偏移量來定位文件指針
int fseek ( FILE * stream, long int offset, int origin );

fteek

返回文件指着相對於起始位置的偏移量
long int ftell ( FILE * stream );

rewind

讓文件指針的位置回到文件的其實位置
void rewind ( FILE * stream );

六.文件結束符判定

被錯誤使用的 feof
牢記:在文件讀取過程中,不能用feof函數的返回值直接用來判斷文件的是否結束。
而是應用於當文件讀取結束的時候,判斷是讀取失敗結束,還是遇到文件尾結束。

  1. 文本文件讀取是否結束,判斷返回值是否爲EOF (fgetc),或者NULL(fgets) 例如:
    fgetc判斷是否爲EOF.
    fgets判斷返回值是否爲NULL.
  2. 二進制文件的讀取結束判斷,判斷返回值是否小於實際要讀的個數。
    例如: fread判斷返回值是否小於實際要讀的個數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章