中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)企業(yè)蛋糕怎么做公司網(wǎng)頁

網(wǎng)站建設(shè)企業(yè)蛋糕,怎么做公司網(wǎng)頁,網(wǎng)站建設(shè)哪家公司好成都網(wǎng)站建設(shè),wordpress get_attached_media一、什么是文件 磁盤上的文件是文件。 1、為什么要使用文件 舉個(gè)例子,當(dāng)我們想實(shí)現(xiàn)一個(gè) “通訊錄” 程序時(shí),在通訊錄中新建聯(lián)系人、刪除聯(lián)系人等一系列操作,此時(shí)的數(shù)據(jù)存儲(chǔ)于內(nèi)存中,程序退出后所有數(shù)據(jù)都會(huì)隨之消失。為了讓通訊錄…

一、什么是文件

磁盤上的文件是文件。

1、為什么要使用文件

????????舉個(gè)例子,當(dāng)我們想實(shí)現(xiàn)一個(gè) “通訊錄” 程序時(shí),在通訊錄中新建聯(lián)系人、刪除聯(lián)系人等一系列操作,此時(shí)的數(shù)據(jù)存儲(chǔ)于內(nèi)存中,程序退出后所有數(shù)據(jù)都會(huì)隨之消失。為了讓通訊錄中的信息得以保存,也就是想讓數(shù)據(jù)持久化,我們就需要采用讓數(shù)據(jù)持久化的方法。我們一般數(shù)據(jù)持久化的方法有:把數(shù)據(jù)存放在磁盤文件中,或存放到數(shù)據(jù)庫等方式


在程序設(shè)計(jì)中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件

2、程序文件

包括源程序文件(后綴為 .c ),目標(biāo)文件( windows 環(huán)境后綴為 .obj ),可執(zhí)行程序( windows 環(huán)境后綴為 .exe)。
#include <stdio.h>int main()
{printf("Hello,World!\n");return 0;
}

(1)

?(2)


3、數(shù)據(jù)文件

文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。

此時(shí),如果我寫的程序在讀寫這個(gè)文件(我可以讀這個(gè)文件夾的內(nèi)容進(jìn)我的程序中,或是將一些內(nèi)容寫到這個(gè)文件夾中),那么這個(gè)文件就成為數(shù)據(jù)文件。?


二、文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),方便用戶識(shí)別和引用。

文件名包含三個(gè)部分:文件路徑 + 文件名主干 + 文件后綴( 例如:C:\code\test.txt )

?為了方便起見,文件標(biāo)識(shí)常被稱為文件名


三、文件類型

  • 根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件被稱為文本文件或者二進(jìn)制文件
  1. 數(shù)據(jù)在內(nèi)存中以二進(jìn)制的形式存儲(chǔ),如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件。
  2. 如果要求在外存上以?ASCII?的形式存儲(chǔ),則需要在存儲(chǔ)前轉(zhuǎn)換。以?ASCII?字符的形式存儲(chǔ)的文件就是文本文件。
一個(gè)數(shù)據(jù)在內(nèi)存中是怎么存儲(chǔ)的呢?
字符一律以? ASCII? 形式存儲(chǔ),數(shù)值型數(shù)據(jù)既可以用? ASCII? 形式存儲(chǔ),也可以使用二進(jìn)制形式存儲(chǔ)。如有整數(shù) 10000 ,如果以? ASCII? 碼的形式輸出到磁盤,則磁盤中占用? 5? 個(gè)字節(jié)(每個(gè)字符一個(gè)字節(jié)),而二進(jìn)制形式輸出,則在磁盤上只占 4? 個(gè)字節(jié)(? VS2019? 測(cè)試)。
#include <stdio.h>int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf); // 二進(jìn)制的形式寫到文件中fclose(pf);pf = NULL;return 0;
}

?

?

?

?


四、文件緩沖區(qū)(File Buffer)

????????ANSIC 標(biāo)準(zhǔn)采用 緩沖文件系統(tǒng) 處理的數(shù)據(jù)文件的,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動(dòng)地在內(nèi)存中為程序中每一個(gè)正在使用的文件開辟一塊“ 文件緩沖區(qū) 。從內(nèi)存向磁盤輸出數(shù)據(jù)會(huì)先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤上。如果從磁盤向計(jì)算機(jī)讀入數(shù)據(jù),則從磁盤文件中讀取數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再?gòu)木彌_區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(程序變量等)。緩沖區(qū)的大小根據(jù) C 編譯系統(tǒng)決定的。

#include <stdio.h>
#include <windows.h>int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf); // 先將代碼放在輸出緩沖區(qū)printf("睡眠10秒-已經(jīng)寫數(shù)據(jù)了,打開test.txt文件,發(fā)現(xiàn)文件沒有內(nèi)容\n");Sleep(10000);printf("刷新緩沖區(qū)\n");fflush(pf); // 刷新緩沖區(qū)時(shí),才將輸出緩沖區(qū)的數(shù)據(jù)寫到文件(磁盤)printf("再睡眠10秒-此時(shí),再次打開test.txt文件,文件有內(nèi)容了\n");Sleep(10000);fclose(pf); // fclose在關(guān)閉文件的時(shí)候,也會(huì)刷新緩沖區(qū)pf = NULL;return 0;
}

?

結(jié)論: 因?yàn)橛芯彌_區(qū)的存在,C 語言在操作文件時(shí),需要做刷新緩沖區(qū)或者在文件操作結(jié)束的時(shí)候關(guān)閉文件。如果不做,可能導(dǎo)致讀寫文件的問題。


五、文件指針

在 C 語言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針稱為文件指針。通過文件指針就可對(duì)它所指的文件進(jìn)行各種操作。

  • 緩沖文件系統(tǒng)中,關(guān)鍵的概念是文件類型指針,簡(jiǎn)稱文件指針。
每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名?FILE (注意是類型) .

例如由 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 _iobuf FILE;

?注意

  1. FILE 的結(jié)構(gòu)在不同的 C 編輯器中包含的內(nèi)容并不是不完全相同的,但還是頗為相似的。
  2. 每當(dāng)打開一個(gè)文件時(shí),系統(tǒng)會(huì)根據(jù)文件的狀況自動(dòng)創(chuàng)建一個(gè) FILE 結(jié)構(gòu)的變量,并填充其中的信息。只要文件被讀寫發(fā)生變化,文件信息區(qū)也會(huì)跟著發(fā)生變化。至于文件變化時(shí)文件信息區(qū)是怎么變化和修改的,我們其實(shí)并不需要關(guān)心這些細(xì)節(jié),因?yàn)?C 語言已經(jīng)幫你弄好了。
  3. 我們一般會(huì)通過一個(gè) FILE 的指針來維護(hù)這個(gè) FILE 結(jié)構(gòu)的變量。并不會(huì)直接使用,而是拿一個(gè)結(jié)構(gòu)體指針指向這個(gè)結(jié)構(gòu),通過這個(gè)指針來訪問和維護(hù)相關(guān)的數(shù)據(jù),這樣使用起來會(huì)更加方便。
// 以創(chuàng)建一個(gè)FILE*的指針變量
FILE* pf; // 文件指針變量
定義? pf? 是一個(gè)指向? FILE ? 類型數(shù)據(jù)的指針變量??梢允? pf? 指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。


六、文件的打開和關(guān)閉

  • 文件在讀寫之前應(yīng)該先打開文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。
  • 在編寫程序的時(shí)候,在打開文件的同時(shí),都會(huì)返回一個(gè)?FILE*?的指針變量指向該文件,也相當(dāng)于建立了指針和文件的關(guān)系。
  • ANSIC 規(guī)定使用?fopen?函數(shù)來打開文件,fclose?來關(guān)閉文件。

?

?

// open the file
FILE * fopen (const char* filename, const char* mode);// close the file
int fclose (FILE* stream);// filename參數(shù)指的是文件名,mode參數(shù)為打開方式

#include <stdio.h>int main()
{FILE* pf = fopen("test.dat", "w");if (pf == NULL) // 檢查是否為空指針{perror("fopen");return 1;}fclose(pf);pf = NULL; // 將pf置為空指針return 0;
}

?一切正常。

我們把 test.dat 文件刪除,然后打開方式改成 r 試試看。

#include <stdio.h>int main()
{FILE* pf = fopen("test.dat", "r");if (pf == NULL) // 檢查是否為空指針{perror("fopen");return 1;}fclose(pf);pf = NULL; // 將pf置為空指針return 0;
}

?perror 返回的錯(cuò)誤信息。

如果不適用相對(duì)路徑,使用絕對(duì)路徑讀文件:

可以使用絕對(duì)路徑,但是要注意轉(zhuǎn)義絕對(duì)路徑中的斜杠

#include <stdio.h>int main()
{// FILE* pf = fopen("D:\code\0824\0824\test.dat", "w"); // errorFILE* pf = fopen("D:\\code\\0824\\0824\\test.dat", "w"); // 轉(zhuǎn)移字符\if (pf == NULL){perror("fopen");return 1;}fclose(pf);pf = NULL;return 0;
}

注意:不關(guān)閉文件的后果:一個(gè)程序能夠打開的文件是有限的,文件屬于一種資源。如果只打開不釋放,文件就會(huì)被占用??赡軙?huì)導(dǎo)致一些操作被緩沖在內(nèi)存中,如果不能正常關(guān)閉,緩沖在內(nèi)存中的數(shù)據(jù)就不能正常寫入到文件中從而導(dǎo)致數(shù)據(jù)的丟失。


七、文件的順序讀寫

  • 順序讀寫,簡(jiǎn)而言之就是按照順序在文件中讀和寫。

首先要了解什么是讀寫:我們寫的程序是在內(nèi)存中,而數(shù)據(jù)是要放到文件中的,文件又是在硬盤上的。當(dāng)我們把文件里的數(shù)據(jù)讀到內(nèi)存中去時(shí),這個(gè)動(dòng)作我們稱之為輸入 / 讀取。反過來,如果把程序中的東西放到硬盤上,這個(gè)動(dòng)作我們稱之為輸出 / 寫入。


1、什么是流

?stdin:標(biāo)準(zhǔn)輸入流 - 鍵盤

?stdout:標(biāo)準(zhǔn)輸出流 - 屏幕

?stderr:標(biāo)準(zhǔn)錯(cuò)誤流 - 屏幕

(它們的類型都是 FILE* )

#include<stdio.h>int main()
{// 從標(biāo)準(zhǔn)輸出流里輸入數(shù)據(jù)fputc('b', stdout);// 同printf("b");fputc('i', stdout);fputc('t', stdout);printf("\n");// 從標(biāo)準(zhǔn)輸入流里讀取數(shù)據(jù)int ret = fgetc(stdin); // 同scanf("%d", ret);printf("%c\n", ret);ret = fgetc(stdin);printf("%c\n", ret);ret = fgetc(stdin);printf("%c\n", ret);return 0;
}


2、字符輸入函數(shù) fgetc

從指定的流 stream 獲取下一個(gè)字符,并把位置標(biāo)識(shí)符向前移動(dòng)(字符必須為一個(gè)無符號(hào)字符)。如果讀取成功會(huì)返回相應(yīng)的?ASCII碼值,如果讀取失敗會(huì)返回一個(gè)?EOF?。適用于所有輸入流。

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ret = fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);fclose(pf);pf = NULL;return 0;
}

?

讀取結(jié)束或者讀取失敗返回 EOF。


3、字符輸出函數(shù) fputc

  • 將參數(shù) char 指定的字符寫入到指定的流 stream 中,并把位置標(biāo)識(shí)符向前移動(dòng) (字符必須為一個(gè)無符號(hào)字符)。適用于所有輸出流。

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputc('a', pf);fputc('b', pf);fputc('c', pf);fclose(pf);pf = NULL;return 0;
}

?abc 成功被寫入。

倘若將代碼修改為:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}/*fputc('a', pf);fputc('b', pf);fputc('c', pf);*/fclose(pf);pf = NULL;return 0;
}

此時(shí)再次運(yùn)行,我們發(fā)現(xiàn)那個(gè)文件里的內(nèi)容不見了(大小也變?yōu)?kb):?


4、文本行輸入函數(shù)?fgets

  • 從指定的流 stream 讀取一行,并把它存儲(chǔ)在 string 所指向的字符串中,當(dāng)讀取(n-1)個(gè)字符時(shí),或者讀取到換行符、到達(dá)文件末尾時(shí),它會(huì)停止,具體視情況而定。適用于所有輸入流。

注意:假如 n 是 100,讀取到的就是 99 個(gè)字符(n-1),因?yàn)橐粢粋€(gè)字符給 '\0'。

?

#include <stdio.h>int main()
{char arr[10] = "xxxxxx"; // 存放處FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fgets(arr, 4, pf);printf("%s\n", arr);fgets(arr, 4, pf);printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
}


5、文本行輸出函數(shù) fputs

  • 將字符串寫入到指定的流 stream 中(不包括空字符)。適用于所有輸出流。

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("abcdef", pf);fputs("123456", pf);fclose(pf);pf = NULL;return 0;
}

如果想要在 "abcdef" 后面換行,只需在 fputs("abcdef\n", pf); 加上換行符即可。?


6、?格式化輸入函數(shù) fscanf

  • fscanf 用于對(duì)格式化的數(shù)據(jù)進(jìn)行讀取,從流 stream 讀取格式化輸入。適用于所有輸入流。

#include <stdio.h>struct Student
{char name[10];int id;float score;
};int main()
{struct Student s1 = { 0 };// 對(duì)格式化的數(shù)據(jù)進(jìn)行寫文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf, "%s %d %f", s1.name, &(s1.id), &(s1.score));printf("%s %d %f\n", s1.name, s1.id, s1.score);fclose(pf);pf = NULL;return 0;
}

注意: p1.name本身就是地址(不用&)。


7、格式化輸出函數(shù) fprintf

#include<stdio.h>
struct S
{char arr[10];int num;float sc;
};int main()
{struct S s = { "abcdef", 10, 5.5f };FILE* pf1 = fopen("test.txt", "w");if(pf1 == NULL){perror("fopen");return 1;}fprintf(pf1, "%s %d %f", s.arr, s.num, s.sc); // 將結(jié)構(gòu)體格式化的數(shù)據(jù)寫入文件fclose(pf1);pf1 = NULL;struct S temp = { 0 }; // 用于存儲(chǔ)讀出的數(shù)據(jù) FILE* pf2 = fopen("test.txt", "r");if(pf2 == NULL){perror("fopen");return 1;}fscanf(pf2, "%s %d %f", temp.arr, &(temp.num), &(temp.sc));	// 再把數(shù)據(jù)從文件中讀到結(jié)構(gòu)體中printf("%s %d %f\n", temp.arr, temp.num, temp.sc); // 打印fclose(pf2);pf2 = NULL;return 0;
}


8、二進(jìn)制輸入函數(shù) fread

  • 從流中讀取,從給定流 stream 讀取數(shù)據(jù)到 buffer 所指向的數(shù)組中。

#include <stdio.h>
// 二進(jìn)制的形式讀struct S
{char arr[10];int num;float score;
};int main()
{struct S s = { 0 };FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f", s.arr, s.num, s.score);fclose(pf);pf = NULL;return 0;
}

9、二進(jìn)制輸出函數(shù) fwrite

  • ?寫一個(gè)數(shù)據(jù)到流中去,把 buffer 所指向的數(shù)組中的數(shù)據(jù)寫入到給定流 stream 中。

#include <stdio.h>
// 二進(jìn)制的形式寫struct S
{char arr[10];int num;float score;
};int main()
{struct S s = { "abcde", 10, 5.5f };FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fwrite(&s, sizeof(struct S), 1, pf);fclose(pf);pf = NULL;return 0;
}

?

為什么是亂碼?為什么 abcde 不是亂碼?
  1. 我們剛才用的都是文本編譯器,文本編譯器打開二進(jìn)制形式的文件完全是兩種狀態(tài)。
  2. 因?yàn)樽址晕谋拘问綄戇M(jìn)去和以二進(jìn)制形式寫進(jìn)去是一樣的,但是對(duì)于整數(shù)、浮點(diǎn)數(shù)等來說就不一樣了,文本形式寫入和二進(jìn)制形式寫入完全是兩個(gè)概念。

結(jié)論:fwritefread 是一對(duì),fwrire 寫進(jìn)去用 fread 讀。


八、文件的隨機(jī)讀寫

1、文件指針定位函數(shù) fseek

  • 根據(jù)文件指針的位置和偏移量來定位文件指針。

int fseek (FILE* stream, long int offset, int origin);// offset是偏移量,origin是起始位置,有三種選項(xiàng):// 1、SEEK_CUR - 當(dāng)前文件指針的位置開始偏移。
// 2、SEEK_END - 文件的末尾位置開始偏移。
// 3、SEEK_SET - 文件的起始位置開始偏移。

?

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

如果我想得到 a a b,該怎么處理呢?
#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);// 調(diào)整文件指針fseek(pf, -1, SEEK_CUR); // SEEK_CUR為當(dāng)前文件指針位置,偏移量為-1,向前移動(dòng)1個(gè)單位ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}


?用?SEEK_SET?,打印?a d e

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);// 調(diào)整文件指針fseek(pf, 2, SEEK_CUR); // SEEK_SET為文件的起始位置,偏移量為2,向后移動(dòng)2個(gè)單位ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}


?用?SEEK_END?,打印?a e f?

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);// 調(diào)整文件指針fseek(pf, -2, SEEK_END); // SEEK_END為當(dāng)前文件末尾位置,偏移量為-2,向前移動(dòng)2個(gè)單位ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}


2、返回偏移量函數(shù) ftell

  • 返回文件指針相對(duì)于起始位置的偏移。

long int ftell ( FILE * stream );
#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 調(diào)整文件指針fseek(pf, 5, SEEK_CUR); // SEEK_CUR為當(dāng)前文件指針位置,偏移量為5,向后移動(dòng)5個(gè)單位int ch = fgetc(pf);printf("%c\n", ch); // f// 返回偏移量int ret = ftell(pf);printf("%d\n", ret); // 6fclose(pf);pf = NULL;return 0;
}

?


3、文件指針回到起始位置函數(shù) rewind

  • rewind(意為倒帶,磁帶倒帶),設(shè)置文件位置為給定流?stream?的文件的開頭,讓文件指針回到起始位置。

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}// 調(diào)整文件指針fseek(pf, 5, SEEK_CUR); // SEEK_CUR為當(dāng)前文件指針位置,偏移量為5,向后移動(dòng)5個(gè)單位// 返回偏移量int loc = ftell(pf);printf("fseek調(diào)整文件指針后:%d\n", loc); // 6// 讓文件指針回到起始位置rewind(pf);// 再次返回偏移量,看看是不是回到起始位置了loc = ftell(pf);printf("使用rewind后:%d\n", loc); // 6fclose(pf);pf = NULL;return 0;
}


九、文件讀取結(jié)束的判定?

1、被錯(cuò)誤使用的 feof

  • 在文件結(jié)束時(shí)判斷文件因?yàn)楹畏N原因導(dǎo)致文件結(jié)束的函數(shù)判斷是因?yàn)樽x取失敗而結(jié)束,還是因?yàn)橛龅轿募捕Y(jié)束。如果文件結(jié)束,則返回非 0 值,否則返回 0。

注意feof?函數(shù)是個(gè)經(jīng)常被錯(cuò)誤使用的一個(gè)函數(shù)。在文件讀取過程中,不能用?feof?函數(shù)的返回值直接判斷文件是否結(jié)束!feof?函數(shù)絕對(duì)不是用來判斷文件是否結(jié)束的函數(shù)!feof?不是用來判定文件是否結(jié)束了的,還是在文件已經(jīng)結(jié)束時(shí),判斷是什么原因?qū)е挛募Y(jié)束的。

?文本文件讀取是否結(jié)束,判斷返回值是否為EOF fgetc),或者NULLfgets

  • fgetc?判斷是否為?EOF。
  • fgets?判斷返回值是否為?NULL。
#include <stdio.h>
#include <stdlib.h>int main()
{int ch = 0; // 注意:int,非char,要求處理EOFFILE* pf = fopen("test.txt", "r");if (!pf){perror("fopen");return EXIT_FAILURE; // 符號(hào)常量EXIT_FAILURE,表示沒有成功地執(zhí)行一個(gè)程序}// fgetc - 當(dāng)讀取失敗的時(shí)候或者遇到文件結(jié)束的時(shí)候,都會(huì)返回EOFwhile ( (ch = fgetc(pf)) != EOF ){putchar(ch);}printf("\n");// 判斷文件結(jié)束的原因if (ferror(pf)) // ferror - 檢查是否出現(xiàn)錯(cuò)誤{  puts("讀取失敗錯(cuò)誤(I/O error when reading)");}else if (feof(pf)){puts("遇到文件尾而結(jié)束(End of file reached successfully)");}fclose(pf);pf = NULL;
}

?


?二進(jìn)制文件的讀取結(jié)束判斷,判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)

  • fread?判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)。
#include <stdio.h>enum { SIZE = 5 };int main(void)
{double a[SIZE] = {1.0,2.0,3.0,4.0,5.0};double b = 0.0;size_t ret_code = 0;FILE *fp = fopen("test.bin", "wb"); // 必須用二進(jìn)制模式fwrite(a, sizeof(*a), SIZE, fp); // 寫double的數(shù)組fclose(fp);fp = fopen("test.bin","rb");// 讀 double 的數(shù)組while((ret_code = fread(&b, sizeof(double), 1, fp))>=1){printf("%lf\n",b);}if (feof(fp)){printf("Error reading test.bin: unexpected end of file\n");}else if (ferror(fp)){perror("Error reading test.bin");}fclose(fp);fp = NULL;
}


2、正確判定文件是否讀取結(jié)束的方法

  • 文本文件讀取是否結(jié)束,判斷返回值是否為?EOFfgetc),或者?NULLfgets)。
  1. fgetc 函數(shù)在讀取結(jié)束時(shí)會(huì)返回 EOF,正常讀取時(shí),返回讀取到的字符的 ASCII 碼值
  2. fgets 函數(shù)在讀取結(jié)束時(shí)會(huì)返回 NULL,正常讀取時(shí),返回存放字符串的空間的起始地址。
  3. fread 函數(shù)在讀取結(jié)束時(shí)會(huì)返回實(shí)際讀取到的完整元素的個(gè)數(shù),如果發(fā)現(xiàn)讀取到的完整的元素個(gè)數(shù)小于指定的元素個(gè)數(shù),那么就是最后一次讀取了。
http://www.risenshineclean.com/news/21735.html

相關(guān)文章:

  • 黃金做空網(wǎng)站長(zhǎng)沙本地推廣聯(lián)系電話
  • 裝飾工程施工工藝流程口碑優(yōu)化
  • wordpress banseo前景
  • 完整版網(wǎng)站推廣方案網(wǎng)站排名優(yōu)化方案
  • 網(wǎng)站建設(shè)方案案例石家莊網(wǎng)絡(luò)營(yíng)銷網(wǎng)站推廣
  • 個(gè)人網(wǎng)站二級(jí)域名做淘寶客企業(yè)網(wǎng)站營(yíng)銷
  • 寧波網(wǎng)站建設(shè)服務(wù)提供商網(wǎng)絡(luò)推廣營(yíng)銷方案免費(fèi)
  • steam課程做網(wǎng)站黑帽seo教程
  • 網(wǎng)站源碼設(shè)計(jì)給我免費(fèi)的視頻在線觀看
  • 唯品會(huì)一家做特賣的網(wǎng)站手機(jī)版百度開戶代理公司
  • 網(wǎng)站備案變更公司名稱百度指數(shù)屬于行業(yè)趨勢(shì)及人群
  • 域名備案關(guān)閉網(wǎng)站保溫杯軟文營(yíng)銷300字
  • 青島專業(yè)做網(wǎng)站優(yōu)化成都網(wǎng)站建設(shè)方案外包
  • 代做吧機(jī)械網(wǎng)站seo搜索引擎優(yōu)化師
  • 電子 網(wǎng)站模板2024年2月疫情又開始了嗎
  • aspx網(wǎng)站開發(fā) 案例淘寶推廣公司
  • 做美妝網(wǎng)站名稱營(yíng)銷案例最新
  • 睢縣做網(wǎng)站的公司百度識(shí)圖軟件
  • 如何網(wǎng)上賺點(diǎn)零花錢seo如何去做優(yōu)化
  • 網(wǎng)站icp備案號(hào)怎么查詢合肥網(wǎng)絡(luò)推廣軟件
  • 湖南服務(wù)專業(yè)的網(wǎng)站制作自創(chuàng)網(wǎng)站
  • 網(wǎng)站seo推廣站長(zhǎng)統(tǒng)計(jì)網(wǎng)站統(tǒng)計(jì)
  • 建設(shè)了網(wǎng)站怎么管理系統(tǒng)代發(fā)新聞稿的網(wǎng)站
  • 專業(yè)做廠房的網(wǎng)站怎么申請(qǐng)域名建立網(wǎng)站
  • 只做一頁的網(wǎng)站多少錢中層管理者培訓(xùn)課程有哪些
  • 網(wǎng)站制作比較好的公司網(wǎng)絡(luò)推廣的方法有
  • 如何做垂直門戶網(wǎng)站國(guó)家免費(fèi)技能培訓(xùn)有哪些
  • 網(wǎng)站建設(shè)規(guī)劃書企業(yè)網(wǎng)站最火的推廣平臺(tái)
  • 常用的建站工具有哪些優(yōu)秀軟文范例
  • 深圳市住房和建設(shè)局網(wǎng)站幫人推廣注冊(cè)app的平臺(tái)