思前想後一個月,我終於敲下了我的第一篇開山之作。 博客千千萬,我的博客首先記錄的是學習時候的理解,用於給自己翻閱查找,現在主要研究的是C語言和STM32。如果能幫到你,那是最好的,假如我寫的東西有錯誤歡迎指正,所以請反覆對比,僅作參考。其次,這裡不僅記錄學習,也會寫下我在朋友圈不能公開的想法和秘密! ...
思前想後一個月,我終於敲下了我的第一篇開山之作。
博客千千萬,我的博客首先記錄的是學習時候的理解,用於給自己翻閱查找,現在主要研究的是C語言和STM32。如果能幫到你,那是最好的,假如我寫的東西有錯誤歡迎指正,所以請反覆對比,僅作參考。其次,這裡不僅記錄學習,也會寫下我在朋友圈不能公開的想法和秘密!
馬上進入主題
一、什麼是文件?
我相信,就算接觸過C語言的文件輸入輸出的人,還會回答:文件不就是滑鼠點擊的東西嘛!其實不全對,因為在C語言程式中,文件有著更廣泛的定義:文件通常是在磁碟或硬碟上的已命名的儲存區。
要看到是通常,那麼就說明會有不尋常的。對於C程式來說,設備也可以看成是文件!例如屏幕和鍵盤。看到這裡的朋友會有一個疑問:那麼C程式和語言有什麼關係呢?文件對C程式有什麼重要性呢?
簡單地理解,文件能夠輸入一些必要的數據給程式使用以及程式輸出數據到文件保存。
1.1 文件的兩種形式
在C程式看來,文件只有兩種形式。
- 文本文件
- 二進位文件
文本文件即裡面的數據都是字元。 字元傳化成對應的ASCII碼存放在記憶體中。如“ABC”就分別是‘A’、'B'、'C'存放
二進位文件即裡面的數據直接存放在記憶體中。無需轉換為ASCII碼,可以理解為機器語言(只有0和1)。例如整數1000轉換為二進位為0010 0111 0001 0000,直接存儲在記憶體中。
二、利用標準IO操作文件
2.1 標準IO(standard high-level I/0)是什麼
標準IO是標準I/O是ANSI C建立的標準函數包和stdio.h頭文件中的定義。通俗的來講就是一些操作IO的庫函數,至於是怎麼實現的我也不知道。今天我們來講三個函數:fopen(), fclose().
分別對應著打開文件、關閉文件兩個功能。
其次,與標準IO對應著的還有文件IO或者叫底層IO(low-level I/O)。暫時不需要關心。
2.2 標準文件
一開始提到,一些設備都被C程式看做是文件。所以C語言定義了三個標準文件:標準輸入(standard input)、標準輸出(standard output)、標準錯誤輸出(standard error output).
分別對應著鍵盤、屏幕、屏幕。但是,標準錯誤輸出強制性輸出到屏幕(即使重定向到其他文件啦顯示錯誤信息)。看到這裡看不懂沒關係,我們結合下麵的函數講解就懂了。
標準文件 | 文件指針 | 通常使用的設備 |
標準輸入 | stdin | 鍵盤 |
標準輸出 | stdout | 顯示器 |
標準錯誤輸出 | stderr | 顯示器 |
文件指針是即將要講到函數裡面的C語言里一個特殊的指針。
三、 fopen()
函數介紹:
打開或創建一個文件並且返回一個文件指針。
函數原型:
FILE *fopen(const char *path, const char *mode);
FILE為一個結構體 但是這個結構體太複雜,暫時不需要弄清楚。
函數詳解:
參數1:const char *path ,這是一個指針,char表明指向的是一個字元串,const表明不能通過path指針變數去修改這個字元串。
這個字元串指定了你要準備打開或創建的文件路徑和名稱,例如“我好餓啊.txt”
參數2:設置打開的模式。可輸入的參數有如下:
模式 | 含義 |
“r” | 只能讀 |
“w” | 只能寫,無此文件則創建,有此文件則清空 |
“a” | 只能寫,會在原來的文件後面添加內容。無此文件則創建文件 |
“r+” | 讀寫文件 |
“w+” | 讀寫文件,無此文件則創建,有此文件則清空 |
“a+” | 讀寫文件,會在原來的文件後面添加內容。無此文件則創建文件 |
上述打開的都是文本本件
此外還有"rb", "wb", "ab", "r+b", "w+b", "a+b",此時打開二進位文件。
path 參數可以是相對路徑(../fishc.txt)也可以是絕對路徑(/home/FishC/fishc.txt),如果只給出文件名而不包含路徑,則表示該文件在當前文件夾中
返回值:
1. 如果文件打開成功,則返回一個指向 FILE 結構的文件指針;
2. 如果文件打開失敗,則返回 NULL 並設置 errno 為指定的錯誤。
舉例子:
FILE *fp; //定義一個文件指針 fp=fopen("c語言數據.txt","r") //以只讀的方式打開文本文件,並返回一個文本指針給fp
然後我們接下來就可以通過fp去操作文件,至於怎麼實現不用管。可以理解為fp現在就指向了一個實際的txt文件。
而且,我們可以用過改變第二個參數感受一下他們之間的區別。
四、fclose()
函數介紹:
關閉文件先前用fopen()打開的文件
關閉後會把緩衝區的數據送到程式或者文件(要看先前對文件的操作是讀取文件數據還是輸出數據到文件)
函數原型:
int fclose(FILE *fp);
函數詳解:
參數:是一個文件指針,指向要關閉的文件。例如先前通過fopen()把創建的文件給了fp,現在fp則代表著這個文件,操作fp即可關閉文件。
返回值:
1. 如果文件關閉成功,返回值是 0;
2. 如果文件關閉失敗,返回值是 EOF,並設置 errno 為指定的錯誤。
記得操作完文件之後要用fclose(),因為調用了fclose函數才能把緩衝區的數據送到指定的地方。fopen和fclose最好同時使用。
接下來我還會繼續講我對緩衝區和流的理解哦,以及fflush函數及其相關代碼例子。敬請期待!