摘要:該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名例如編譯環(huán)境提供的頭文件中有以下的文件類型聲明每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。
什么是文件:
磁盤上的文件就是文件
程序文件:
源程序文件test.c 目標(biāo)文件test.obj 可執(zhí)行程序test.exe
數(shù)據(jù)文件:
文件的內(nèi)容不一定是程序,而是程序運(yùn)行時讀寫的數(shù)據(jù),比如程序運(yùn)行需要 從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件,如:data.txt
一個文件要有一個唯一的文件標(biāo)識,以便用戶識別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如: c:/code/test.txt
為了方便起見,文件標(biāo)識常被稱為文件名。
每一個打開的文件都會后一個與它匹配的文件信息區(qū),存儲文件信息
這些信息保存在一個結(jié)構(gòu)體變量中,如:struct FILE f;。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE.
例如,VS2008編譯環(huán)境提供的 stdio.h 頭文件中有以下的文件類型聲明:
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};typedef struct _iobuf FILE;
每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。
一般都是通過一個FILE的指針來維護(hù)這個FILE結(jié)構(gòu)的變量,這樣使用起來更加方便。
ANSIC 規(guī)定使用fopen函數(shù)來打開文件,fclose來關(guān)閉文件。
#include int main(){ FILE* pf = fopen("data.txt", "r"); if (pf == NULL) { perror("fopen"); // 輸出: // fopen: No such file or directory // 因?yàn)槲募淮嬖?/span> return -1; } // 讀文件 // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
絕對路徑
#include int main(){ FILE* pf = fopen("C://Users//Chloe//Desktop//data.txt", "r"); // 絕對路徑 // FILE* pf = fopen("data.txt", "r"); // 相對路徑 if (pf == NULL) { perror("fopen"); return -1; } // 讀文件 // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
#include int main(){ FILE* pf = fopen("C://Users//Chloe//Desktop//data.txt", "w"); // 會生成一個文件 if (pf == NULL) { perror("fopen"); return -1; } // 讀文件 // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
fputc - 字符輸出函數(shù) 寫一個字符
fgetc - 字符輸入函數(shù) 讀一個字符
int fgetc( FILE *stream );
#include int main(){ FILE* pf = fopen ("C://Users//Chloe//Desktop//data.txt", "w"); if (NULL == pf) { perror("fopen"); return -1; } // 寫文件 fputc("b", pf); // 在data.txt中寫入bit fputc("i", pf); fputc("t", pf); // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
流:高度抽象的概念
C語言的程序,只要運(yùn)行起來,就默認(rèn)打開了三個流: stdout - 標(biāo)準(zhǔn)輸出流 stdin - 標(biāo)準(zhǔn)輸入流 stderr - 標(biāo)準(zhǔn)錯誤流 類型都是 FILE*
#include int main(){ fputc("b", stdout); fputc("i", stdout); fputc("t", stdout);}
int fputc( int c, FILE *stream );
把文件內(nèi)容改成abcdef 會輸出什么?
#include int main(){ FILE* pf = fopen ("C://Users//Chloe//Desktop//data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } // 讀文件 int ch = fgetc(pf); printf("%c/n", ch); // a ch = fgetc(pf); printf("%c/n", ch); // b ch = fgetc(pf); printf("%c/n", ch); // c // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
也可以從標(biāo)準(zhǔn)輸入讀,也就是鍵盤
#include int main(){ int ch = fgetc(stdin); printf("%c/n", ch); ch = fgetc(stdin); printf("%c/n", ch); ch = fgetc(stdin); printf("%c/n", ch);}
#include int main(){ fputc("b", stdout); // putchar printf("%c", ch); int ch = fgetc(stdin); // getchar scanf("%c", ch); printf("%c/n", ch);}
int fputs( const char *string, FILE *stream );
把數(shù)據(jù)放進(jìn)流里
#include int main(){ FILE* pf = fopen("data.txt", "w"); if (NULL == pf) { perror("fopen"); return -1; } // 寫文件 // 寫一行數(shù)據(jù) fputs("hello world/n", pf); fputs("hello bit/n", pf); fclose(pf); pf = NULL;}
char *fgets( char *string, int n, FILE *stream );
從流里讀數(shù)據(jù)
想要讀5個字符,但實(shí)際只讀了4個字符,因?yàn)楹竺婧笥幸粋€ /0
改成20:
int fprintf( FILE *stream, const char *format [, argument ]...);
與 printf 函數(shù)對比
示例:
#include struct S{ int n; double d;};int main(){ struct S s = { 100, 3.14 }; FILE* pf = fopen("data.txt", "w"); if (NULL == pf) { perror("fopen"); return -1; } // 寫文件 fprintf(pf, "%d %lf", s.n, s.d); // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
int fscanf( FILE *stream, const char *format [, argument ]... );
與 printf 函數(shù)對比
示例:
#include struct S{ int n; double d;};int main(){ struct S s = { 0 }; FILE* pf = fopen("data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } // 讀文件 fscanf(pf, "%d %lf", &(s.n), &(s.d)); printf("%d %lf", s.n, s.d); // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
示例:
wb”(只寫) 為了輸出數(shù)據(jù),打開一個二進(jìn)制文件
#include struct S{ int n; double d; char name[10];};int main(){ struct S s = { 100, 3.24, "zhangsan"}; FILE* pf = fopen("data.txt", "wb"); if (NULL == pf) { perror("fopen"); return -1; } // 以二進(jìn)制方式寫 fwrite(&s, sizeof(s), 1, pf); // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
文件內(nèi)輸出一堆二進(jìn)制
示例:
#include struct S{ int n; double d; char name[10];};int main(){ struct S s = { 100, 3.24, "zhangsan" }; FILE* pf = fopen("data.txt", "rb"); if (NULL == pf) { perror("fopen"); return -1; } // 讀文件 - 以二進(jìn)制方式讀 fwrite(&s, sizeof(s), 1, pf); // 打印文件 printf("%d %lf %s/n", s.n, s.d, s.name); // 100 3.240000 zhangsan // 關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
scanf/fscanf/sscanfprintf/fprintf/sprintf
scanf:從標(biāo)準(zhǔn)輸入流(鍵盤)讀取格式化的數(shù)據(jù)
printf:把格式化的數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出(屏幕)上
fscanf:從所有的輸入流讀取格式化的數(shù)據(jù)
fprintf:把格式化的數(shù)據(jù)輸出到所有輸出流(屏幕 / 文件)上
剩下 sscanf 和 sprintf 是什么意思?
從一個字符串里讀格式化的數(shù)據(jù)
寫格式化的數(shù)據(jù)到字符串里
舉例:
#include struct S{ int n; double d; char name[10];};int main(){ char arr[100] = { 0 }; struct S s = { 100, 3.14, "zhangsan" }; // 把一個格式化的數(shù)據(jù)轉(zhuǎn)換成字符串 sprintf(arr, "%d %lf %s/n", s.n, s.d, s.name); // 打印 printf("%s/n", arr); return 0;}
如何從arr里解析出格式化的結(jié)構(gòu)體放進(jìn)tmp:
#include struct S{ int n; double d; char name[10];};int main(){ char arr[100] = { 0 }; struct S s = { 100, 3.14, "zhangsan" }; struct S tmp = { 0 }; // 把一個格式化的數(shù)據(jù)轉(zhuǎn)換成字符串 sprintf(arr, "%d %lf %s/n", s.n, s.d, s.name); // 以字符串形式打印 printf("%s/n", arr); // 100 3.140000 zhangsan // 從arr中的字符串中提取一個格式化的數(shù)據(jù) sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name); // 按照格式化的形式打印的 printf("%d %lf %s/n", tmp.n, tmp.d, tmp.name); // 100 3.140000 zhangsan return 0;}
文件的版本:
【Contact】結(jié)構(gòu)體+動態(tài)內(nèi)存管理+文件存儲實(shí)現(xiàn)簡易通訊錄代碼
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121411.html
摘要:二什么是文件磁盤上的文件就是文件。文件指針變量定義是一個指向類型數(shù)據(jù)的指針變量。表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流,也可以是文件流。文件結(jié)構(gòu)體指針,將要讀取的文件流。 ...
目錄 ??? 一,寫在前面 二,為什么使用文件 1,原因 2,數(shù)據(jù)流 3,緩沖區(qū)(Buffer) 4,C語言中帶緩沖區(qū)的文件處理 5,文件類型 6,文件存取方式 三,什么是文件 1,程序文件 ?2,數(shù)據(jù)文件 3,文件名 四,文件的打開和關(guān)閉? 1,文件指針 ?2,文件的打開和關(guān)閉 五,文件的順序讀寫 1,功能 2,代碼實(shí)現(xiàn) 六,文件的隨機(jī)讀寫 1,fseek 2,ftell 3,rewind 七,...
閱讀 1859·2021-11-22 15:24
閱讀 1315·2021-11-12 10:36
閱讀 3216·2021-09-28 09:36
閱讀 1844·2021-09-02 15:15
閱讀 2759·2019-08-30 15:54
閱讀 2399·2019-08-30 11:02
閱讀 2398·2019-08-29 13:52
閱讀 3548·2019-08-26 11:53