国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言】文件操作重點內(nèi)容梳理

這篇具有很好參考價值的文章主要介紹了【C語言】文件操作重點內(nèi)容梳理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文目錄

1. 什么是文件

1.1 程序文件

1.2 數(shù)據(jù)文件

1.3 文件名

2. 文件的打開和關(guān)閉

2.1 文件指針

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

3. 文件的順序讀寫

3.1 順序讀寫函數(shù)介紹

4. 文件的隨機(jī)讀寫

4.1 fseek

4.2 ftell

4.3 rewind

5. 文本文件和二進(jìn)制文件

6. 文件讀取結(jié)束的判定

6.1 被錯誤使用的 feof?

7. 文件緩沖區(qū)


1. 什么是文件

磁盤上的文件是文件。

但是在程序設(shè)計中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件(從文件功能的角度來分類的)。

1.1 程序文件

包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。

1.2 數(shù)據(jù)文件

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

本文討論的是數(shù)據(jù)文件。

在之前的學(xué)習(xí)中所處理數(shù)據(jù)的輸入輸出都是以終端為對象的,即從終端的鍵盤輸入數(shù)據(jù),運行結(jié)果顯示到顯示器上。

其實有時候我們會把信息輸出到磁盤上,當(dāng)需要的時候再從磁盤上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理的就是磁盤上文件。

1.3 文件名

一個文件要有一個唯一的文件標(biāo)識,以便用戶識別和引用。

文件名包含3部分:文件路徑+文件名主干+文件后綴

例如: c:\code\test.txt?

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

2. 文件的打開和關(guān)閉

2.1 文件指針

緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡稱“文件指針”。

每個被使用的文件都在內(nèi)存中開辟了一個相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個結(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;

不同的C編譯器的FILE類型包含的內(nèi)容不完全相同,但是大同小異。

每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。

一般都是通過一個FILE的指針來維護(hù)這個FILE結(jié)構(gòu)的變量,這樣使用起來更加方便。

下面我們可以創(chuàng)建一個FILE*的指針變量:

FILE* pf;//文件指針變量

定義pf是一個指向FILE類型數(shù)據(jù)的指針變量。可以使pf指向某個文件的文件信息區(qū)(是一個結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。

比如:

【C語言】文件操作重點內(nèi)容梳理,C語言,c語言,開發(fā)語言,學(xué)習(xí)方法,程序人生

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

文件在讀寫之前應(yīng)該先打開文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。

在編寫程序的時候,在打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當(dāng)于建立了指針和文件的關(guān)系。

ANSIC 規(guī)定使用fopen函數(shù)來打開文件,fclose來關(guān)閉文件。

//打開文件
FILE * fopen ( const char * filename, const char * mode );
//關(guān)閉文件
int fclose ( FILE * stream );

打開方式如下:

文件使用方式 含義 如果指定文件不存在
“r”(只讀) 為了輸入數(shù)據(jù),打開一個已經(jīng)存在的文本文件 出錯
“w”(只寫) 為了輸出數(shù)據(jù),打開一個文本文件 建立一個新的文件
“a”(追加) 向文本文件尾添加數(shù)據(jù) 建立一個新的文件
“rb”(只讀) 為了輸入數(shù)據(jù),打開一個二進(jìn)制文件 出錯
“wb”(只寫) 為了輸出數(shù)據(jù),打開一個二進(jìn)制文件 建立一個新的文件
“ab”(追加) 向一個二進(jìn)制文件尾添加數(shù)據(jù) 建立一個新的文件
“r+”(讀寫) 為了讀和寫,打開一個文本文件 出錯
“w+”(讀寫) 為了讀和寫,建立一個新的文件 建立一個新的文件
“a+”(讀寫) 打開一個文件,在文件尾進(jìn)行讀寫 建立一個新的文件
“rb+”(讀寫) 為了讀和寫打開一個二進(jìn)制文件 出錯
“wb+”(讀寫) 為了讀和寫,新建一個新的二進(jìn)制文件 建立一個新的文件
“ab+”(讀寫) 打開一個二進(jìn)制文件,在文件尾進(jìn)行讀和寫 建立一個新的文件

實例代碼:

/* fopen fclose example */
#include <stdio.h>
int main()
{
	FILE* pFile;
	//打開文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//關(guān)閉文件
		fclose(pFile);
	}
	return 0;
}

3. 文件的順序讀寫

3.1 順序讀寫函數(shù)介紹

功能 函數(shù)名 適用于
字符輸入函數(shù) fgetc 所有輸入流
字符輸出函數(shù) fputc 所有輸出流
文本行輸入函數(shù) fgets 所有輸入流
文本行輸出函數(shù) fputs 所有輸出流
格式化輸入函數(shù) fscanf 所有輸入流
格式化輸出函數(shù) fprintf 所有輸出流
二進(jìn)制輸入 fread 文件
二進(jìn)制輸出 fwrite 文件

4. 文件的隨機(jī)讀寫

4.1 fseek

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

int fseek ( FILE * stream, long int offset, int origin );

例子:

/* fseek example */
#include <stdio.h>

int main()
{
	FILE* pFile;
	pFile = fopen("example.txt", "wb");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	return 0;
}

4.2 ftell

返回文件指針相對于起始位置的偏移量。

long int ftell ( FILE * stream );

例子:

/* ftell example : getting size of a file */
#include <stdio.h>

int main()
{
	FILE* pFile;
	long size;

	pFile = fopen("myfile.txt", "rb");
	if (pFile == NULL) perror("Error opening file");
	else
	{
		fseek(pFile, 0, SEEK_END); // non-portable
		size = ftell(pFile);
		fclose(pFile);
		printf("Size of myfile.txt: %ld bytes.\n", size);
	}
	return 0;
}

4.3 rewind

讓文件指針的位置回到文件的起始位置。

void rewind ( FILE * stream );

例子:

/* rewind example */
#include <stdio.h>

int main()
{
	int n;
	FILE* pFile;
	char buffer[27];

	pFile = fopen("myfile.txt", "w+");
	for (n = 'A'; n <= 'Z'; n++)
		fputc(n, pFile);
	rewind(pFile);
	fread(buffer, 1, 26, pFile);
	fclose(pFile);
	buffer[26] = '\0';
	puts(buffer);
	return 0;
}

5. 文本文件和二進(jìn)制文件

根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件被稱為文本文件或者二進(jìn)制文件。

數(shù)據(jù)在內(nèi)存中以二進(jìn)制的形式存儲,如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉(zhuǎn)換。以ASCII字符的形式存儲的文件就是文本文件。

一個數(shù)據(jù)在內(nèi)存中是怎么存儲的呢?

字符一律以ASCII形式存儲,數(shù)值型數(shù)據(jù)既可以用ASCII形式存儲,也可以使用二進(jìn)制形式存儲。

如有整數(shù)10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占用5個字節(jié)(每個字符一個字節(jié)),而二進(jìn)制形式輸出,則在磁盤上只占4個字節(jié)(VS2013測試)。

【C語言】文件操作重點內(nèi)容梳理,C語言,c語言,開發(fā)語言,學(xué)習(xí)方法,程序人生

【C語言】文件操作重點內(nèi)容梳理,C語言,c語言,開發(fā)語言,學(xué)習(xí)方法,程序人生

測試代碼:

#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;
}

【C語言】文件操作重點內(nèi)容梳理,C語言,c語言,開發(fā)語言,學(xué)習(xí)方法,程序人生

6. 文件讀取結(jié)束的判定

6.1 被錯誤使用的 feof?

牢記:在文件讀取過程中,不能用feof函數(shù)的返回值直接來判斷文件的是否結(jié)束。

?feof 的作用是:當(dāng)文件讀取結(jié)束的時候,判斷是讀取結(jié)束的原因是否是:遇到文件尾結(jié)束。

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

? ? ? ? 例如:

? ? ? ? ? ? ? ? ○???fgetc 判斷是否為 EOF .

? ? ? ? ? ? ? ? ○???fgets 判斷返回值是否為 NULL .

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

? ? ? ? 例如:

? ? ? ? ? ? ? ? ○? ?fread 判斷返回值是否小于實際要讀的個數(shù)。

正確的使用:

文本文件的例子:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int c; // 注意:int,非char,要求處理EOF
	FILE* fp = fopen("test.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 當(dāng)讀取失敗的時候或者遇到文件結(jié)束的時候,都會返回EOF
	while ((c = fgetc(fp)) != EOF) // 標(biāo)準(zhǔn)C I/O讀取文件循環(huán)
	{
		putchar(c);
	}
	//判斷是什么原因結(jié)束的
	if (ferror(fp))
		puts("I/O error when reading");
	else if (feof(fp))
		puts("End of file reached successfully");

	fclose(fp);
}

二進(jìn)制文件的例子:

#include <stdio.h>

enum { SIZE = 5 };
int main(void)
{
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.bin", "wb"); // 必須用二進(jìn)制模式
	fwrite(a, sizeof * a, SIZE, fp); // 寫 double 的數(shù)組
	fclose(fp);

	double b[SIZE];
	fp = fopen("test.bin", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 讀 double 的數(shù)組
	if (ret_code == SIZE) {
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
		putchar('\n');
	}
	else { // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}

	fclose(fp);
}

7. 文件緩沖區(qū)

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

【C語言】文件操作重點內(nèi)容梳理,C語言,c語言,開發(fā)語言,學(xué)習(xí)方法,程序人生

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10環(huán)境測試
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ū)時,才將輸出緩沖區(qū)的數(shù)據(jù)寫到文件(磁盤)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此時,再次打開test.txt文件,文件有內(nèi)容了\n");
	Sleep(10000);
	fclose(pf);
	//注:fclose在關(guān)閉文件的時候,也會刷新緩沖區(qū)
	pf = NULL;
	return 0;
}

這里可以得出一個結(jié)論

因為有緩沖區(qū)的存在,C語言在操作文件的時候,需要做刷新緩沖區(qū)或者在文件操作結(jié)束的時候關(guān)閉文件。

如果不做,可能導(dǎo)致讀寫文件的問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-621487.html

到了這里,關(guān)于【C語言】文件操作重點內(nèi)容梳理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 02【保姆級】-GO語言開發(fā)注意事項(特色重點)

    02【保姆級】-GO語言開發(fā)注意事項(特色重點)

    之前我學(xué)過C、Java、Python語言時總結(jié)的經(jīng)驗: 先建立整體框架,然后再去摳細(xì)節(jié)。 先Know how,然后know why。 先做出來,然后再去一點點研究,才會事半功倍。 適當(dāng)?shù)泥駠魍虠?。因為死摳某個知識點很浪費時間的。 對于GO語言,切記遵守語法格式規(guī)則。(例如python語言、例如

    2024年02月06日
    瀏覽(20)
  • learn_C_deep_10 深刻認(rèn)識C語言重點操作符

    learn_C_deep_10 深刻認(rèn)識C語言重點操作符

    注釋符號 其他注釋方法 注釋建議 接續(xù)符和轉(zhuǎn)義符 在續(xù)行符之前或者之后帶上空格,行不行? n:換行符與r:回車符之間的區(qū)別 兩個小程序(旋轉(zhuǎn)光標(biāo)、倒計時) 單引號和雙引號 ?\\\'abcd\\\'這樣寫有問題嗎? 特殊情況 為何計算機(jī)需要字符 邏輯運算符 短路 位運算符 vs 、|| vs |的

    2024年02月05日
    瀏覽(24)
  • C語言---數(shù)據(jù)結(jié)構(gòu)實驗---順序表的合并---鏈表的基本操作---重點解析約瑟夫問題

    C語言---數(shù)據(jù)結(jié)構(gòu)實驗---順序表的合并---鏈表的基本操作---重點解析約瑟夫問題

    實驗的寫法多種多樣,但本文并未采用 #define 定義容量的寫法,這樣寫已經(jīng)是很老舊過時的寫法。所有實驗主體采用均為動態(tài)開辟,后續(xù)如果利用 C++ 來寫或許會應(yīng)用更多語法… 本篇展示數(shù)據(jù)結(jié)構(gòu)的兩個實驗 其中,重點分析約瑟夫問題 實驗中代碼的命名風(fēng)格等均與下方博客

    2024年02月16日
    瀏覽(95)
  • C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)

    C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)

    一、開發(fā)目標(biāo):使用keybd_event和鍵盤HOOK實現(xiàn)一個按鍵模擬DNF中的技能指令。操作角色是紅眼。 二、項目進(jìn)度:初步實現(xiàn)技能指令釋放,沒有對鍵盤連按做處理,會有N多重復(fù)命令,導(dǎo)致角色會抽搐。沒有做自定義按鍵,所有指令都是寫到程序中的,不夠靈活。 三、開發(fā)環(huán)境:

    2024年02月09日
    瀏覽(19)
  • 線性代數(shù)的學(xué)習(xí)和整理14: 線性方程組求解的3種方法,重點講矩陣函數(shù)求解

    線性代數(shù)的學(xué)習(xí)和整理14: 線性方程組求解的3種方法,重點講矩陣函數(shù)求解

    目錄 0 寫在前面的一些內(nèi)容 0.1 學(xué)習(xí)心得: 0.2 參考其他書籍總結(jié)的知識點,對照學(xué)習(xí) 1 線性方程組求解 1.1 常見的線性方程組如下 1.2 記住常見的 矩陣函數(shù)的維數(shù)的關(guān)系 1.3? 需要求解的方程組和矩陣的對應(yīng)關(guān)系,需要先厘清 1.3.1?如果只需要求解x,是類 Ax=b的形式 1.3.2? ?如

    2024年02月05日
    瀏覽(56)
  • SpringBoot核心內(nèi)容梳理

    SpringBoot核心內(nèi)容梳理

    Spring Boot是一個基于Spring框架的快速開發(fā)應(yīng)用程序的工具。它簡化了Spring應(yīng)用程序的創(chuàng)建和開發(fā)過程,使開發(fā)人員能夠更快速地創(chuàng)建獨立的、生產(chǎn)就緒的Spring應(yīng)用程序。它采用了“約定優(yōu)于配置”的原則,盡可能地減少開發(fā)人員需要進(jìn)行手動配置的步驟,提供了自動配置和快

    2024年02月14日
    瀏覽(13)
  • hive重點內(nèi)容匯總

    ?? ?? ?? ?? 這篇文章一方面是幫助我記憶常用函數(shù),如果工作中忘了不用百度,直接翻這篇文章就好。另一方面也想分享給各位,大家一起學(xué)習(xí)。 ?? ?? ?? ?? ?? ?? 使用格式: from_unixtime(10位時間戳,\\\'想轉(zhuǎn)成的日期格式\\\') 舉例: 日期格式寫 \\\'年-月-日 時

    2024年02月10日
    瀏覽(21)
  • 貪心算法重點內(nèi)容

    貪心算法重點內(nèi)容

    4.1 部分背包 按照單位重量的價值排序 4.2 最小生成樹 兩種算法 ? 4.3 單源最短路徑 ? 4.4 哈夫曼樹 ?

    2024年02月15日
    瀏覽(18)
  • 【Java 編程】文件操作,文件內(nèi)容的讀寫—數(shù)據(jù)流

    平時說的文件一般都是指存儲在 硬盤 上的普通文件 形如 txt, jpg, mp4, rar 等這些文件都可以認(rèn)為是普通文件,它們都是在硬盤上存儲的 在計算機(jī)中,文件可能是一個 廣義的概念 ,就不只是包含普通文件,還可以包含 目錄 (把目錄稱為目錄文件) 操作系統(tǒng)中,還會使用文件來描

    2023年04月08日
    瀏覽(33)
  • Linux :: 【基礎(chǔ)指令篇 :: 文件內(nèi)容操作:(4)】:: head / tail 指令 :: 查看前后 n 行內(nèi)容 | 指定查看文件的部分內(nèi)容

    前言:本篇是 Linux 基本操作篇章的內(nèi)容! 筆者使用的環(huán)境是基于騰訊云服務(wù)器:CentOS 7.6 64bit。 學(xué)習(xí)集: C++ 入門到入土?。。W(xué)習(xí)合集 Linux 從命令到網(wǎng)絡(luò)再到內(nèi)核!學(xué)習(xí)合集 注: 本文涉及文件內(nèi)容查看或編輯,故有預(yù)先準(zhǔn)備的測試示例,若讀者無測試示例,可參照 第 0

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包