C语言:文件操作
文件操作
系統(tǒng)文件
標(biāo)準(zhǔn)輸入:stdin,編號(hào)0,printf-標(biāo)準(zhǔn)輸出
標(biāo)準(zhǔn)輸出:stdout,編號(hào)1,scanf-標(biāo)準(zhǔn)輸入
標(biāo)準(zhǔn)錯(cuò)誤:stderr,編號(hào)2,perror-標(biāo)準(zhǔn)錯(cuò)誤
應(yīng)用程序啟動(dòng)時(shí),自動(dòng)被打開;程序執(zhí)行結(jié)束時(shí),自動(dòng)被關(guān)閉
文件指針
- 文件指針定義:FILE *fp;
- 文件指針初始化:fp = fopen();
- 操作文件:使用文件讀寫函數(shù)來完成,fputc,fgets,fputs,fgets,fread,fwrite等
文件分類
- 設(shè)備文件
屏幕、鍵盤、磁盤、網(wǎng)卡、聲卡、顯卡、揚(yáng)聲器等 - 磁盤文件
文本文件:字符表示數(shù)據(jù)
二進(jìn)制文件:字節(jié)表示數(shù)據(jù)
文件操作步驟
FILE* fopen(const char* filename,const char* mode);
參數(shù)1-filename:待打開文件的文件名(訪問路徑)
參數(shù)2-mode:文件操作權(quán)限
返回值:成功返回打開文件的文件指針;失敗返回NULL
1.mode
r/rb:以只讀方式打開文件,若文件不存在則報(bào)錯(cuò)
w/wb:以寫方式打開文件,若文件不存在則新建,若存在則清空
a/ab:以追加方式打開文件,若文件不存在則新建,若存在則在末尾追加內(nèi)容
r+/rb+:以可讀可寫方式打開文件(不創(chuàng)建新文件)
w+/wb+:以可讀可寫方式打開文件(若文件不存在則新建,若存在則清空)
a+/ab+:以追加方式打開可讀可寫文件(若文件不存在則新建,若存在則在末尾追加內(nèi)容)
2.b是二進(jìn)制模式的意思,只在windows有效,linux上兩種形式作用一樣
3.linux下文件行尾以\n結(jié)尾,windows下文件行尾以\r\n結(jié)尾
讀寫文件
關(guān)閉文件fclose()
int fclose(FILE* stream);
參數(shù)1-stream:打開文件的文件指針(fopen的返回值)
返回值:成功0,失敗-1
訪問路徑
1.相對(duì)路徑
vs環(huán)境下
編譯執(zhí)行,文件相對(duì)路徑是指相對(duì)于工程文件所在文件目錄位置;
雙擊可執(zhí)行文件執(zhí)行,相對(duì)路徑指相對(duì)于可執(zhí)行文件所在目錄位置。
2.絕對(duì)路徑:從系統(tǒng)磁盤根盤符開始,到待訪問文件的完整路徑
文件操作函數(shù)
- 按字符寫文件fputc
int fputc(int ch,FILE* stream);
參數(shù)1-ch:待寫入的字符
參數(shù)2-stream:打開文件的fp
返回值:寫入成功返回寫入字符的ascii碼,失敗返回-1
- 按字符讀文件fgetc
int fgetc(FILE* stream);
參數(shù):待讀取的文件指針
返回值:成功返回讀取到的字符的ascii,失敗返回-1;
文本文件的結(jié)束標(biāo)記: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);
函數(shù)作用:判斷是否到達(dá)文件結(jié)尾
參數(shù):fopen返回值
返回值:到達(dá)文件結(jié)尾返回非0【真】,沒有到達(dá)文件結(jié)尾返回0【假】
文本文件由ascii組成,asciima范圍是0~127,正文不會(huì)出現(xiàn)-1,所以可以用EOF(-1)判斷是否到達(dá)結(jié)尾;二進(jìn)制文件正文可能會(huì)存在-1,可以使用feof判斷是否到達(dá)文件結(jié)尾。
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);
函數(shù)功能:從stream指定文件讀取字符串保存到str指定內(nèi)存空間,直到出現(xiàn)換行或文件尾或已讀size-1個(gè)字符為止,末尾自動(dòng)添加’\0’
參數(shù)1-str:讀取到的字符串
參數(shù)2-size:指定最大讀取字符串長(zhǎng)度(size-1)
參數(shù)3-stream:文件指針
返回值:成功返回讀取到的字符串,讀到文件尾或出錯(cuò)返回NULL
int fputs(const char* str,FILE* stream);
函數(shù)功能:將str指定的字符串寫入到stream指定文件中,字符串’\0’不寫入文件
參數(shù)1-str:字符串
參數(shù)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():寫指定格式內(nèi)容到文件中
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; }操作二進(jìn)制文件
- fwrite():將數(shù)據(jù)寫入文件
size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);
參數(shù)1-ptr:待寫出數(shù)據(jù)的地址
參數(shù)2-size:待寫出數(shù)據(jù)的大小
參數(shù)3-nmemb:寫出次數(shù)(size*nmemb=寫出數(shù)據(jù)總大小)
參數(shù)4-stream:文件
返回值:成功返回寫入文件次數(shù)(參3的值),失敗返回0
- fread()從文件讀取數(shù)據(jù)
size_t fread(const void* ptr,size_t size,size_t nmemb,FILE* stream);
參數(shù)1-ptr:讀取出的數(shù)據(jù)的存儲(chǔ)的地址
參數(shù)2-size:一次讀取字節(jié)數(shù)
參數(shù)3-nmemb:讀取次數(shù)(size*nmemb=讀出數(shù)據(jù)總大小)
參數(shù)4-stream:文件
返回值:成功返回讀取文件次數(shù)(參3的值),失敗返回0
隨機(jī)位置讀
文件讀寫指針,一個(gè)文件內(nèi)只有一個(gè)
- fseek():修改文件指針位置
int fseek(FILE* stream,long offset,int whence);
參數(shù)1-stream:文件
參數(shù)2-offset:偏移量(+向后,-向前)
參數(shù)3-whence:SEEK_SET(文件開頭),SEEK_CUR(文件當(dāng)前位置),SEEK_END(文件結(jié)尾位置)
返回值:成功0,失敗-1
- ftell():獲取文件讀寫指針位置
long ftell(FILE* stream);
返回值:從文件當(dāng)前讀寫位置到起始位置的偏移量
- 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);//文件讀寫指針為同一個(gè),不重置指針會(huì)繼續(xù)往后讀取數(shù)據(jù),從而造成讀不到數(shù)據(jù)的結(jié)果;也可通過fseek修改文件指針位置fgets(buf, 6, fp);printf("buf = %s", buf);fclose(fp);return 0; }linux和windows文件區(qū)別
獲取文件狀態(tài)
- 獲取文件狀態(tài)
int stat(const char* path,struct stat* buf);
參數(shù)1-path:訪問文件路徑
參數(shù)2-buf:文件屬性結(jié)構(gòu)體
返回值:成功0,失敗-1
使用該函數(shù)需要使用頭文件:<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);//傳出參數(shù):函數(shù)調(diào)用完畢時(shí)充當(dāng)函數(shù)返回值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; }緩沖區(qū)刷新
(緩輸出)標(biāo)準(zhǔn)輸出–stdout–標(biāo)準(zhǔn)輸出緩存區(qū):寫給屏幕的數(shù)據(jù),先輸出到緩存區(qū),由緩沖區(qū)一次性刷新到物理設(shè)備(屏幕)
(預(yù)讀入)標(biāo)準(zhǔn)輸入-- stdin–標(biāo)準(zhǔn)輸入緩沖區(qū):從鍵盤讀取的數(shù)據(jù)直接讀到緩沖區(qū),由緩沖區(qū)給程序提供數(shù)據(jù)
行緩沖:printf(),遇到\n就會(huì)將緩沖區(qū)中的數(shù)據(jù)刷新到物理設(shè)備
全緩沖:文件,緩沖區(qū)存滿數(shù)據(jù)刷新到物理設(shè)備
無緩沖:perror,緩沖區(qū)只要有數(shù)據(jù)就立即刷新到物理設(shè)備
自動(dòng)刷新緩沖區(qū):文件關(guān)閉時(shí)緩沖區(qū)會(huì)被自動(dòng)刷新
手動(dòng)刷新緩沖區(qū):
int fflush(FILE* stream);
返回:成功0,失敗-1
總結(jié)
- 上一篇: 【unity】动画状态机中Transit
- 下一篇: 02点餐项目需求分析