摘要:二什么是文件磁盤(pán)上的文件就是文件。文件指針變量定義是一個(gè)指向類型數(shù)據(jù)的指針變量。表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流,也可以是文件流。文件結(jié)構(gòu)體指針,將要讀取的文件流。
提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
我們前面學(xué)習(xí)結(jié)構(gòu)體時(shí),寫(xiě)了通訊錄的程序,當(dāng)通訊錄運(yùn)行起來(lái)時(shí),可以給通訊錄增加、刪除數(shù)據(jù),此時(shí)的數(shù)據(jù)是存放在內(nèi)存中的,當(dāng)程序退出時(shí),通訊錄的數(shù)據(jù)就被銷毀了,下次運(yùn)行通訊錄時(shí),數(shù)據(jù)又得重新錄入,如果使用這樣的通訊錄就會(huì)非常的坐牢。
所以這些通訊錄數(shù)據(jù)我們僅僅放在內(nèi)存里是不行的,大家都知道,我們電腦的C盤(pán)、D盤(pán)、E盤(pán)等等里面存放的文件,你不進(jìn)行刪除,它就一直在那里,那我們可以試著把通訊錄的數(shù)據(jù)存入磁盤(pán)里,來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久性。
磁盤(pán)上的文件就是文件。
但是在程序設(shè)計(jì)中,我們一般談的文件有兩種:
1.程序文件
2.數(shù)據(jù)文件
(以文件功能來(lái)劃分)
包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。
文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫(xiě)的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。
本文著重討論數(shù)據(jù)文件
在以前各章所處理的數(shù)據(jù)的輸入輸出都是以終端為對(duì)象的,即從終端的鍵盤(pán)輸入數(shù)據(jù),運(yùn)行的結(jié)果顯示到顯示器上,其實(shí)有時(shí)候我們會(huì)把信息輸出到鍵盤(pán)上,當(dāng)需要的時(shí)候再?gòu)逆I盤(pán)上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理的就是磁盤(pán)上的文件。
下圖是數(shù)據(jù)文件與程序文件的交互簡(jiǎn)圖
一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),便于用戶的識(shí)別與引用。
文件名包含3個(gè)部分:文件路徑+文件名主干+文件后綴
栗子:E:/c-language-notes/test.txt
這里的E:/c-language-notes/叫作文件路徑,是在E盤(pán)c-language-notes這個(gè)路徑底下
test叫作文件主干
.txt叫做文件后綴
為了方便起見(jiàn),文件標(biāo)識(shí)常被稱為文件名
緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡(jiǎn)稱文件指針
每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,結(jié)構(gòu)體類型名為FILE(下文會(huì)提到)
如上圖,當(dāng)你想要操作一個(gè)數(shù)據(jù)文件時(shí),你不可避免地會(huì)經(jīng)歷3個(gè)操作:打開(kāi)文件、讀/寫(xiě)文件、關(guān)閉文件。只要你打開(kāi)文件,系統(tǒng)會(huì)自動(dòng)生成一個(gè)叫做文件信息區(qū)的東西,也就是會(huì)創(chuàng)建一個(gè) FILE 類型結(jié)構(gòu)體變量,上圖以f作為示例,實(shí)際也可能是其他的,那么創(chuàng)建完成后,f就會(huì)和data.txt文件強(qiáng)關(guān)聯(lián)了,f會(huì)記錄data文件名、文件有多大、文件在哪個(gè)位置、文件的狀態(tài)是怎樣的。。。
vs2013的編譯器環(huán)境提供的stdio.h的頭文件中有以下的文件類型聲明:
struct _iobuf{ char*_ptr; int _cnt; char*_base; int _flag; int _file; int _charbuf; int _bufsiz; char*_tmpfname;};typedef struct _ibuf FILE//把上述結(jié)構(gòu)體重命名為FILE
不同編譯器的FILE類型包含的內(nèi)容不一定完全相同,但基本都是大同小異,每當(dāng)打開(kāi)一個(gè)文件時(shí),系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)果的變量,并填充其中的信息,我們使用者不必過(guò)度關(guān)心細(xì)節(jié),按周總理說(shuō)的“求同存異”即可。
一般都是通過(guò)一個(gè)FILE類型的指針來(lái)維護(hù)FILE結(jié)構(gòu)的變量,這樣使用起來(lái)更加方便。
FILE*pf;//文件指針變量
定義pf是一個(gè)指向FILE類型數(shù)據(jù)的指針變量。可以使pf指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過(guò)該文件信息區(qū)中的信息就可以訪問(wèn)該文件。也就是說(shuō),通過(guò)文件指針變量能找到與它關(guān)聯(lián)的文件如下圖所示:
pf是指向文件信息區(qū)的,而文件信息區(qū)又可以確切的找到與它關(guān)聯(lián)的文件,這樣你就可以通過(guò)pf找到所需文件并進(jìn)行相關(guān)操作。
文件在讀寫(xiě)之前應(yīng)該先打開(kāi)文件,在使用后應(yīng)該關(guān)閉文件。
在編寫(xiě)程序時(shí),打開(kāi)文件的同時(shí),都會(huì)返回一個(gè)FILE*的指針變量指向該文件,也相對(duì)于建立了指針和文件的聯(lián)系。
ANSIC規(guī)定使用fopen函數(shù)來(lái)打開(kāi)文件,fclose來(lái)關(guān)閉文件
FILE *fopen(const char* filename, const char* moede);//打開(kāi)文件//fopen第一個(gè)參數(shù)是文件名,第二個(gè)參數(shù)是打開(kāi)模式//比如你傳一個(gè)test.txt到一個(gè)參數(shù)里,傳的其實(shí)是首字母t的地址//打開(kāi)模式是這樣的,你是想給這個(gè)文件寫(xiě)點(diǎn)東西還是想讀取這個(gè)文件的一些東西int fclose(FILE*stream);//關(guān)閉文件
關(guān)于打開(kāi)模式如下圖,比如你打開(kāi)模式是r,那你的打開(kāi)方式就是讀,如果你的文件不存在或者沒(méi)有被找到,那fopen函數(shù)就會(huì)調(diào)用失敗
(圖片來(lái)自比特就業(yè)課,這里只舉r一個(gè)打開(kāi)方式,其他打開(kāi)方式讀者可自行對(duì)照上表)
fopen打開(kāi)模式打開(kāi)data.txt文件會(huì)返回一個(gè)FILE*的指針,該指針是指向與data.txt文件相關(guān)聯(lián)的文件信息區(qū)的起始地址,如果打開(kāi)失敗會(huì)返回空指針。
fclose關(guān)閉文件相對(duì)fopen就簡(jiǎn)單很多了,你要關(guān)閉哪個(gè)文件,我們直接傳那個(gè)文件關(guān)聯(lián)的文件信息區(qū)的指針即可,也就是上圖的pf
打開(kāi)和關(guān)閉實(shí)際操作代碼示例如下:
比如我現(xiàn)在要打開(kāi)E:/c-language-notes/test.21.10.9路徑下的data.txt文件
int main(){ //打開(kāi)文件 //fopen函數(shù) FILE*pf=fopen("E://c-language-notes//test.21.10.9//data.txt", "r"); //這里的"/"可能會(huì)與后面的字母構(gòu)成轉(zhuǎn)義字符,我們用/對(duì)/進(jìn)行轉(zhuǎn)義一下,讓/單純是一個(gè)/ //fopen函數(shù)會(huì)返回一個(gè)FILE*的指針,打開(kāi)失敗返回空指針 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //讀文件。。。 //關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
需要注意的是,fclose關(guān)閉文件是不會(huì)把pf置為空指針的,我們需要手動(dòng)操作置為空指針
(圖片來(lái)自比特就業(yè)課)
所有輸入流包括:istream 類連續(xù)文本模式輸入使用、ifstream磁盤(pán)文件輸入、istringstream 類從內(nèi)存字符串的輸入。
fgetc和fputc函數(shù)分別是讀入一個(gè)字符和輸出一個(gè)字符
如上圖,我們寫(xiě)一個(gè)程序時(shí),會(huì)產(chǎn)生一些數(shù)據(jù),數(shù)據(jù)會(huì)存放在內(nèi)存中,如果你想把數(shù)據(jù)寫(xiě)入(輸出)到文件里,或者你想把文件里的信息讀到內(nèi)存中,叫讀(輸入操作)。我們用輸入/輸出操作就用的是fgetc與fputc
fputc函數(shù)示例:
// int fputc(int c, FILE *stream);函數(shù)聲明int main(){ FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "w");//以“只寫(xiě)w”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //寫(xiě)文件 fputc("b", pf); fputc("i", pf); fputc("t", pf); fclose(pf); pf = NULL; return 0;}
運(yùn)行完上述代碼后,相關(guān)文件自動(dòng)出現(xiàn)fputc函數(shù)寫(xiě)入的三個(gè)字
fgetc函數(shù)示例:
//int fgetc(FILE *filename);函數(shù)聲明int main(){ FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "r");//以“只讀r”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //讀文件 int ch1=fgetc(pf); printf("%c/n", ch1); int ch2 = fgetc(pf); printf("%c/n", ch2); int ch3 = fgetc(pf); printf("%c/n", ch3); fclose(pf); pf = NULL; return 0;}
假設(shè)我們現(xiàn)在相關(guān)文件里有3個(gè)字母abc
我們運(yùn)行上述程序,程序自動(dòng)從文件里獲取三個(gè)字母abc
我們?cè)賮?lái)看一看文本行輸入/輸出函數(shù)
fputs函數(shù)示例:
//int fputs(const char *s, FILE *stream);函數(shù)聲明//s 代表要輸出的字符串的首地址,可以是字符數(shù)組名或字符指針變量名。//stream 表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流 stdout,也可以是文件流。標(biāo)準(zhǔn)輸出流即屏幕輸出,printf 其實(shí)也是向標(biāo)準(zhǔn)輸出流中輸出的。int main(){ FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "w");//以“只寫(xiě)W”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //寫(xiě)文件(寫(xiě)一行) fputs("hello world/n", pf); fputs("hello bit/n", pf); fclose(pf); pf = NULL; return 0;}
和fputc差不多,fputc是寫(xiě)一個(gè)字母,fputs是寫(xiě)一行,運(yùn)行完上述程序,相關(guān)文件夾出現(xiàn)hello world 和hello bit
fgets函數(shù)示例:
//char *fgets(char *buf, int bufsize, FILE *stream);//*buf: 字符型指針,指向用來(lái)存儲(chǔ)所得數(shù)據(jù)的地址。//bufsize: 整型數(shù)據(jù),指明存儲(chǔ)數(shù)據(jù)的大小。//*stream: 文件結(jié)構(gòu)體指針,將要讀取的文件流。int main(){ FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "r");//以“只讀r”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //讀文件(讀一行) char arr[20] = { 0 }; fgets(arr,5,pf); printf("%s/n", arr);//打印hell,說(shuō)是最多讀5個(gè)其實(shí)是讀到第四個(gè),然后第五個(gè)補(bǔ)/0 fclose(pf); pf = NULL; return 0;}
我們?cè)任募镉衕ello world 和hello bit,我們讀一行中的5個(gè)字符到arr里
說(shuō)是打印5個(gè)字符,其實(shí)是打印4個(gè)字符,第五個(gè)字符是自動(dòng)補(bǔ)/0
格式化輸入輸出也就是按某種格式寫(xiě)入或讀取
fprintf函數(shù)示例:
struct S{ int n; double d;};int main(){ //int fprintf(FILE *filename, const char *string, . . . .);函數(shù)聲明 //看起來(lái)函數(shù)聲明有點(diǎn)麻煩,我們?cè)賮?lái)看一下常見(jiàn)的printf函數(shù)聲明 //int printf( const char *format, … ); //對(duì)比一下很容易發(fā)現(xiàn)也就是比printf函數(shù)多一個(gè)指針參數(shù)而已,其他的都按printf來(lái)即可 struct S s = { 100,3.14 }; FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "w");//以“只寫(xiě)w”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //寫(xiě)文件 fprintf(pf,"%d %lf", s.n, s.d); fclose(pf); pf = NULL; return 0;}
fprintf就是printf函數(shù)多一個(gè)pf指針,其他的和printf都是一樣的,上述代碼運(yùn)行一下,相關(guān)文件出現(xiàn)100,和3.140000(浮點(diǎn)型默認(rèn)6位小數(shù))
fscanf函數(shù)示例:
struct S{ int n; double d;};int main(){ //int fscanf(FILE *stream, char *format,[argument...]);函數(shù)聲明 //和fprintf一樣,就是scanf函數(shù)前面多一個(gè)pf指針參數(shù) struct S s = { 0}; FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "r");//以“只讀r”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //讀文件 fscanf(pf,"%d %lf", &(s.n), &(s.d)); printf("%d %lf/n", s.n, s.d); fclose(pf); pf = NULL; return 0;}
原先文件里有100 3.140000,運(yùn)行程序后讀取出這兩個(gè)數(shù)
fwrite函數(shù)聲明如下
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr-- 這是指向要被寫(xiě)入的元素?cái)?shù)組的指針。
size-- 這是要被寫(xiě)入的每個(gè)元素的大小,以字節(jié)為單位。
nmemb-- 這是元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)。
stream-- 這是指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸出流。
fwrite函數(shù)示例:
//size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)//ptr-- 這是指向要被寫(xiě)入的元素?cái)?shù)組的指針。//size-- 這是要被寫(xiě)入的每個(gè)元素的大小,以字節(jié)為單位。//nmemb-- 這是元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)。//stream-- 這是指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸出流。struct S{ int n; double d; char name[20];};int main(){ struct S s = { 100,3.14,"zhangsan" }; FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "wb");//以“只寫(xiě)wb”的模式打開(kāi)文件 if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //寫(xiě)文件-二進(jìn)制方式寫(xiě) fwrite(&s, sizeof(s), 1, pf); //關(guān)閉文件 fclose(pf); pf = NULL; return 0;}
這里要注意的是,我們以二進(jìn)制fwrite寫(xiě)入,產(chǎn)生的是二進(jìn)制文件,所以我們以二進(jìn)制的wb模式打開(kāi),文件里的內(nèi)容如下
因?yàn)槭嵌M(jìn)制文件,我們直接看是看不懂的,但是我們知道可以二進(jìn)制讀,也就是下面的fread函數(shù)
函數(shù)聲明:size_t fread( void *buffer, size_t size, size_t count, FILE *stream )
buffer 是讀取的數(shù)據(jù)存放的內(nèi)存的指針(可以是數(shù)組,也可以是新開(kāi)辟的空間,buffer就是一個(gè)索引)
size 是每次讀取的字節(jié)數(shù)
count 是讀取次數(shù)
strean 是要讀取的文件的指針
fread函數(shù)示例:
struct S{ int n; double d; char name[20];};int main(){ struct S s = {0}; FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "rb");//以“只寫(xiě)wb”的模式打開(kāi)文件 //wb if (pf == NULL) { perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息 return -1; } //讀文件-二進(jìn)制方式讀 fread(&s, sizeof(struct S), 1, pf); //打印 printf("%d %lf %s/n", s.n, s.d, s.name); fclose(pf); pf = NULL; return 0;}
我們現(xiàn)在文件里是這些東西,我們運(yùn)行程序讀一下
可以讀出之前寫(xiě)入的東西
函數(shù)聲明:int fseek(FILE *stream, long offset, int fromwhere);
函數(shù)設(shè)置文件指針stream的位置。如果執(zhí)行成功,stream將指向以fromwhere為基準(zhǔn),偏移offset個(gè)字節(jié)的位置。如果執(zhí)行失敗(比如offset超過(guò)文件自身大小),則不改變stream指向的位置。執(zhí)行成功返回0,否則返回其他數(shù)。
fromwhere有三個(gè)值:
SEEK_CUR 文件指針當(dāng)前位置
SEEK_END 文件的末尾
SEEK_SET 文件的起始
比如a的地址就是文件的起始,f就是文件的末尾,假如我現(xiàn)在fgetc讀了一個(gè),指針從a往后移動(dòng)一位,指針指向b,那b所在位置就是SEEK_CUR,也就是文件指針當(dāng)前位置
注意:隨機(jī)讀寫(xiě)不是亂讀,而是想讀哪里讀哪里,比如我想讀文件第三個(gè)字母,我就可以直接用隨機(jī)讀寫(xiě)讀取第三個(gè)字母。我們?nèi)砸陨厦孢@個(gè)文本文檔為例:
現(xiàn)在我要讀第三個(gè),按照常規(guī)的順序讀寫(xiě),是有一個(gè)指針指向a,然后每讀一個(gè),指針往后移一位,讀第三個(gè)要移動(dòng)2次。fseek函數(shù)就是可以快速根據(jù)指針的位置和偏移量來(lái)定位文件指針,大白話講就是fseek函數(shù)可以快速找到第三個(gè)字母的指針。
#define _CRT_SECURE_NO_WARNINGS#include //fseek函數(shù)int main(){ //1.打開(kāi)文件 FILE*pf=fopen("E://c-language-notes//test.21.10.11//data.txt", "r"); if (pf == NULL) { perror("fopen"); return -1; } //2.讀文件(隨機(jī)讀寫(xiě)) //讀c fseek(pf, 2, SEEK_SET);//現(xiàn)在我要讀c,剛開(kāi)始cur和set都是起始位置,用cur也可 int ch = fgetc(pf); printf("%c/n", ch); //讀b fseek(pf, -2, SEEK_CUR); ch = fgetc(pf); printf("%c/n", ch); //3.關(guān)閉文件 return 0;}
關(guān)于讀b,因?yàn)槲覀冏xc之后,指針會(huì)自動(dòng)往后移一位,所以cur是指向d的,b關(guān)于d的偏移量是-2,所以我們用fseek(pf, -2, SEEK_CUR);讀取
函數(shù)聲明:long int ftell(FILE*filenname);
返回文件指針相對(duì)起始位置的偏移量
#include //fseek函數(shù)int main(){ //1.打開(kāi)文件 FILE*pf=fopen("E://c-language-notes//test.21.10.11//data.txt", "r"); if (pf == NULL) { perror("fopen"); return -1; } //2.讀文件(隨機(jī)讀寫(xiě)) //讀c fseek(pf, 2, SEEK_SET);//現(xiàn)在我要讀c,剛開(kāi)始cur和set都是起始位置,用cur也可 int ch = fgetc(pf); printf("%c/n", ch); //讀b fseek(pf, -2, SEEK_CUR); ch = fgetc(pf); printf("%c/n", ch); int a=ftell(pf);//b讀完之后指針自動(dòng)往后一位到c,c相對(duì)a偏移量為2 printf("%d", a);//打印2 //3.關(guān)閉文件 return 0;}
繼上一段代碼,我們讀完b之后指針自動(dòng)往后移動(dòng)一位指向c,c相對(duì)起始位置a的偏移量為2,所以ftell會(huì)返回2
函數(shù)聲明:void rewind(FILE *stream);
不管pf現(xiàn)在在什么位置,傳過(guò)去,pf重新指向文件起始位置
根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件被稱為文本文件或者二進(jìn)制文件
數(shù)據(jù)在內(nèi)存中以二進(jìn)制的形式存儲(chǔ),如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件
如果要求在外存上以ASCII碼的形式存儲(chǔ),則需要在存儲(chǔ)前進(jìn)行轉(zhuǎn)換。以ASCII碼的形式存儲(chǔ)的文件就是文本文件
一個(gè)數(shù)據(jù)在內(nèi)存中是怎么存儲(chǔ)的呢?
字符一律以ASCII碼的形式進(jìn)行存儲(chǔ),數(shù)值型的數(shù)據(jù)即可用ASCII碼的形式存儲(chǔ),也可以用二進(jìn)制形式存儲(chǔ),如下,我們進(jìn)行10000的存儲(chǔ)
(圖片來(lái)自比特就業(yè)課)
如果我們按ASCII形式存儲(chǔ),把10000共5位,我們把每位上的數(shù)字看做一個(gè)字符,共要5個(gè)字節(jié)
如果我們直接按二進(jìn)制形式進(jìn)行存儲(chǔ),二進(jìn)制的10000,是
00000000 00000000 00100111 00010000共需占4個(gè)字節(jié)(1個(gè)整形)
牢記:在文件讀取過(guò)程中,不能使用feof函數(shù)的返回值直接來(lái)判斷文件的結(jié)束與否,而是應(yīng)用于當(dāng)文件讀取結(jié)束的時(shí)候,判斷是讀取失敗結(jié)束,還是遇到文件尾結(jié)束
1.文本文件讀取是否結(jié)束,判斷返回值是否為EOF(fgetc),或者NULL(fgets)
*fgetc判斷是否為EOF
fgetc讀到一個(gè)字符返回int,如果文件結(jié)束沒(méi)讀到或者遇到錯(cuò)誤,返回EOF
原文件里有abcdef5個(gè)字符,現(xiàn)在我們?cè)趺蠢胒getc進(jìn)行打印,并判斷是否結(jié)束呢?
代碼如下:
#include int main(){ //打開(kāi)文件 FILE*pf=fopen("E://c-language-notes//test.21.10.11//data.txt", "r"); if (pf == NULL) { perror("fopen"); return -1; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/122562.html
摘要:語(yǔ)言在設(shè)計(jì)中考慮了函數(shù)的高效性和易用性兩個(gè)原則。在語(yǔ)言中,最常見(jiàn)的當(dāng)屬函數(shù)了。以上就是一個(gè)函數(shù),它被稱為語(yǔ)言的入口函數(shù),或者主函數(shù)。例如和都是函數(shù)名。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。 ...
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國(guó)慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過(guò)哪些技術(shù)類書(shū)籍。 大家好,我是...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:層確保數(shù)據(jù)一致性和可靠性。保證集群的相關(guān)組件在同一時(shí)刻能夠達(dá)成一致,相當(dāng)于集群的領(lǐng)導(dǎo)層,負(fù)責(zé)收集更新和發(fā)布集群信息。元數(shù)據(jù)服務(wù)器,跟蹤文件層次結(jié)構(gòu)并存儲(chǔ)只供使用的元數(shù)據(jù)。啟迪云-高級(jí)開(kāi)發(fā)工程師 ?侯玉彬前言上一次簡(jiǎn)單的介紹Ceph的過(guò)去和未來(lái)的發(fā)展。這一節(jié)將詳細(xì)介紹Ceph的構(gòu)件以及組件。Ceph存儲(chǔ)架構(gòu)Ceph 存儲(chǔ)集群由幾個(gè)不同的daemon組成,每個(gè)daemon負(fù)責(zé)Ceph 的一個(gè)獨(dú)特...
閱讀 3222·2023-04-26 02:27
閱讀 2144·2021-11-22 14:44
閱讀 4095·2021-10-22 09:54
閱讀 3201·2021-10-14 09:43
閱讀 755·2021-09-23 11:53
閱讀 12728·2021-09-22 15:33
閱讀 2713·2019-08-30 15:54
閱讀 2686·2019-08-30 14:04