C語言-文件操作
總結一下今天下午學習的內容:
13.1
文件通常是硬盤或固態硬盤上的一段已命名儲存區,在使用C語言與文件進行交互時,有“文本模式”和“二進制模式”兩種。對於UNIX和Linux來說這兩種模式沒有任何區別,但對於其他系統來說,在儲存區域的劃分上有所不同。
I/O(輸入輸出)可以選擇兩個標準,一個是操作系統攜帶的底層I/O,一個是C程序攜帶的標準I/O包,後者具有可移植性。
每一個C程序都會自動打開三個文件,標準輸入、標準輸出和標準錯誤輸出,其中第三個會將錯誤信息發送到顯示屏上,是一種標準的寫法。
對於標準I/O除了攜帶大量的文件操作函數可供使用外,還有一個優勢就是“輸入和輸出都是緩沖的”。
13.2
exit將控制權交給操作系統,return將控制權交給上一級(即退出函數),除了在遞歸型主函數中以外,exit和return的效果是一樣的;
疑惑:書上說UNIX和Lniux只有一種文件類型,但查到的信息不是這樣……
fopen打開文件時,有多種模式,其中追加符‘+‘表示擴展權限,‘x‘表示“安全模式”(我自己命名的),‘b‘表示二進制。
fp所指向的是一個數據對象。
文件的輸入輸出函數中使用stdout進行標準輸入輸出。
如果getc()讀到了文件結尾,將返回EOF
scanf/printf與fscanf/fprintf之間的區分是根據和內存之間的關系而來的。
如果磁盤已滿、移動磁盤或者出現I/O錯誤,都會導致fclose()函數失敗;
標準的打開文件方式:
if((in = fopen(name,"w")) == NULL) { fprintf(stderr,"Can‘t creat output file.\n"); exit(EXIT_FALLURE); }
其中的exit(EXIT_FALLURE)表示退出程序,並關閉所有文件;
13.3
同時操作文件數是有限制的,範圍一般是10-20。
在編寫程序的時候,經常使用類似#define MAX 41的代碼來定義常量,目的是為了日後的修改方便。
空字符(字符串的終止標誌)與空格字符不一樣。
回車符和換行符不一樣,在windows下輸入大鍵盤中的回車鍵,將輸入回車‘\r’和換行‘\n‘。
gets()函數涉及到越界問題,在正式的程序編輯中最好不要出現,可以使用fgets()代替它,但因為fgets在處理換行符時與gets的差異問題,在CPP中使用了一個自編寫的s_gets(),而C11中自帶一個可擴展的get_s(),具體的使用就要涉及到編譯器的選擇了……經過一番調查,還是要上手VS,使用Clang進行編譯。
13.5
每次函數對文件指針進行操作之後,移動的是文件指針指向的文件結構數據體中的某個指針。
fseek()和ftell()用來移動和操作文件指針。
fgetpos()和fsetpos()是對大型文件進行操作的函數。
13.7
在這裏記錄一些文件操作函數,不常用,但放這裏給自己提個醒兒……
ungetc——將執行字符放回輸入流
fflush——更新流
setvbuf——創建一個供標準I/O函數替換使用的緩沖區。
fread和fwrite在二進制下對數據進行操作,參數需要註意一下,考試時比較有用:
size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);
這個還挺方便的……
feof——當上一次輸入調用時檢測到文件結尾時返回一個非零值(等會兒找個程序試一下)
ferror——當讀或寫出現錯誤,ferror返回一個非零值,否則返回0。
以上。
C語言-文件操作