C语言:文件操作
文件操作
系統文件
標準輸入:stdin,編號0,printf-標準輸出
標準輸出:stdout,編號1,scanf-標準輸入
標準錯誤:stderr,編號2,perror-標準錯誤
應用程序啟動時,自動被打開;程序執行結束時,自動被關閉
文件指針
- 文件指針定義:FILE *fp;
- 文件指針初始化:fp = fopen();
- 操作文件:使用文件讀寫函數來完成,fputc,fgets,fputs,fgets,fread,fwrite等
文件分類
- 設備文件
屏幕、鍵盤、磁盤、網卡、聲卡、顯卡、揚聲器等 - 磁盤文件
文本文件:字符表示數據
二進制文件:字節表示數據
文件操作步驟
FILE* fopen(const char* filename,const char* mode);
參數1-filename:待打開文件的文件名(訪問路徑)
參數2-mode:文件操作權限
返回值:成功返回打開文件的文件指針;失敗返回NULL
1.mode
r/rb:以只讀方式打開文件,若文件不存在則報錯
w/wb:以寫方式打開文件,若文件不存在則新建,若存在則清空
a/ab:以追加方式打開文件,若文件不存在則新建,若存在則在末尾追加內容
r+/rb+:以可讀可寫方式打開文件(不創建新文件)
w+/wb+:以可讀可寫方式打開文件(若文件不存在則新建,若存在則清空)
a+/ab+:以追加方式打開可讀可寫文件(若文件不存在則新建,若存在則在末尾追加內容)
2.b是二進制模式的意思,只在windows有效,linux上兩種形式作用一樣
3.linux下文件行尾以\n結尾,windows下文件行尾以\r\n結尾
讀寫文件
關閉文件fclose()
int fclose(FILE* stream);
參數1-stream:打開文件的文件指針(fopen的返回值)
返回值:成功0,失敗-1
訪問路徑
1.相對路徑
vs環境下
編譯執行,文件相對路徑是指相對于工程文件所在文件目錄位置;
雙擊可執行文件執行,相對路徑指相對于可執行文件所在目錄位置。
2.絕對路徑:從系統磁盤根盤符開始,到待訪問文件的完整路徑
文件操作函數
- 按字符寫文件fputc
int fputc(int ch,FILE* stream);
參數1-ch:待寫入的字符
參數2-stream:打開文件的fp
返回值:寫入成功返回寫入字符的ascii碼,失敗返回-1
- 按字符讀文件fgetc
int fgetc(FILE* stream);
參數:待讀取的文件指針
返回值:成功返回讀取到的字符的ascii,失敗返回-1;
文本文件的結束標記:EOF(-1)
void read_file() {FILE* fp = fopen("F:/test/test.txt", "r");if (fp == NULL) {perror("fopen error");return;}char ch = fgetc(fp);while (ch != -1) {printf("%c ", ch);ch = fgetc(fp);}fclose(fp); }- feof
int feof(FILE* stream);
函數作用:判斷是否到達文件結尾
參數:fopen返回值
返回值:到達文件結尾返回非0【真】,沒有到達文件結尾返回0【假】
文本文件由ascii組成,asciima范圍是0~127,正文不會出現-1,所以可以用EOF(-1)判斷是否到達結尾;二進制文件正文可能會存在-1,可以使用feof判斷是否到達文件結尾。
void read_file() {FILE* fp = fopen("F:/test/test.txt", "r");if (fp == NULL) {perror("fopen error");return;}char ch = fgetc(fp);while (1) {if (feof(fp)) {break;}printf("%c ", ch);ch = fgetc(fp);}fclose(fp); }- 按行讀寫文件
char* fgets(char* str,int size,FILE* stream);
函數功能:從stream指定文件讀取字符串保存到str指定內存空間,直到出現換行或文件尾或已讀size-1個字符為止,末尾自動添加’\0’
參數1-str:讀取到的字符串
參數2-size:指定最大讀取字符串長度(size-1)
參數3-stream:文件指針
返回值:成功返回讀取到的字符串,讀到文件尾或出錯返回NULL
int fputs(const char* str,FILE* stream);
函數功能:將str指定的字符串寫入到stream指定文件中,字符串’\0’不寫入文件
參數1-str:字符串
參數2-stream:文件指針
返回值:成功0,失敗-1
案例:獲取鍵盤輸入寫入文件
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) {FILE* fp = fopen("F:/test/test.txt","a");if (fp == NULL) {perror("fopen error");return -1;}char buf[4096];while (1) {fgets(buf,4096,stdin);if (strcmp(buf, ":wq\n") == 0) {break;}fputs(buf, fp);}fclose(fp);return 0; }操作文本文件
- fprintf():寫指定格式內容到文件中
int fprintf(FILE* stream,const char* format,...);
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) {FILE* fp = fopen("F:/test/test03.c", "w");if (fp == NULL) {perror("fopen error");return -1;}fprintf(fp, "%d%c%d=%d\n", 10, '*', 7, 10 * 7);fclose(fp);return 0; }- fscanf():
int fscanf(FILE* stream,const char* format,...);
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {FILE* fp = fopen("F:/test/test03.c", "r");if (fp == NULL) {perror("fopen error");return -1;}int a, b, c;char ch;fscanf(fp, "%d%c%d=%d\n", &a, &ch, &b, &c);printf("%d%c%d=%d\n", a, ch, b, c);fclose(fp);return 0; }操作二進制文件
- fwrite():將數據寫入文件
size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);
參數1-ptr:待寫出數據的地址
參數2-size:待寫出數據的大小
參數3-nmemb:寫出次數(size*nmemb=寫出數據總大小)
參數4-stream:文件
返回值:成功返回寫入文件次數(參3的值),失敗返回0
- fread()從文件讀取數據
size_t fread(const void* ptr,size_t size,size_t nmemb,FILE* stream);
參數1-ptr:讀取出的數據的存儲的地址
參數2-size:一次讀取字節數
參數3-nmemb:讀取次數(size*nmemb=讀出數據總大小)
參數4-stream:文件
返回值:成功返回讀取文件次數(參3的值),失敗返回0
隨機位置讀
文件讀寫指針,一個文件內只有一個
- fseek():修改文件指針位置
int fseek(FILE* stream,long offset,int whence);
參數1-stream:文件
參數2-offset:偏移量(+向后,-向前)
參數3-whence:SEEK_SET(文件開頭),SEEK_CUR(文件當前位置),SEEK_END(文件結尾位置)
返回值:成功0,失敗-1
- ftell():獲取文件讀寫指針位置
long ftell(FILE* stream);
返回值:從文件當前讀寫位置到起始位置的偏移量
- rewind():把文件讀寫指針重置到文件開頭
void rewind(FILE* stream);
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {FILE* fp = fopen("F:/test/test08.txt", "r+");if (fp == NULL) {perror("fopen error");}char buf[6];fputs("111112222233333", fp);rewind(fp);//文件讀寫指針為同一個,不重置指針會繼續往后讀取數據,從而造成讀不到數據的結果;也可通過fseek修改文件指針位置fgets(buf, 6, fp);printf("buf = %s", buf);fclose(fp);return 0; }linux和windows文件區別
獲取文件狀態
- 獲取文件狀態
int stat(const char* path,struct stat* buf);
參數1-path:訪問文件路徑
參數2-buf:文件屬性結構體
返回值:成功0,失敗-1
使用該函數需要使用頭文件:<sys/types.h>、<sys/stat.h>
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include<sys/types.h> #include<sys/stat.h>int main(void) {struct stat buf;int ret = stat("F:/test/test08.txt", &buf);//傳出參數:函數調用完畢時充當函數返回值printf("文件大小:%d\n", buf.st_size);return 0; }刪除、重命名文件
- 刪除文件
int remove(const char* pathname);
- 重命名文件
int rename(const char* oldpath,const char* new path);
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {//remove("F:/test/test07.txt");rename("F:/test/test05.txt", "F:/test/改名.txt");return 0; }緩沖區刷新
(緩輸出)標準輸出–stdout–標準輸出緩存區:寫給屏幕的數據,先輸出到緩存區,由緩沖區一次性刷新到物理設備(屏幕)
(預讀入)標準輸入-- stdin–標準輸入緩沖區:從鍵盤讀取的數據直接讀到緩沖區,由緩沖區給程序提供數據
行緩沖:printf(),遇到\n就會將緩沖區中的數據刷新到物理設備
全緩沖:文件,緩沖區存滿數據刷新到物理設備
無緩沖:perror,緩沖區只要有數據就立即刷新到物理設備
自動刷新緩沖區:文件關閉時緩沖區會被自動刷新
手動刷新緩沖區:
int fflush(FILE* stream);
返回:成功0,失敗-1
總結
- 上一篇: 【unity】动画状态机中Transit
- 下一篇: 02点餐项目需求分析