" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言常見的文件操作函數(shù)

 更新時間:2022年01月06日 16:14:24   作者:Pretend..  
這篇文章主要為大家介紹了C語言文件操作函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

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

1、文件指針

每個被使用的文件都在內(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;

每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結(jié)構(gòu)的變量,并填充其中的信息,一般都是通過一個FILE指針來維護這個FILE結(jié)構(gòu)的變量,這樣使用起來更加方便。

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

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

通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。

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

文件在讀寫之前需要先打開文件,使用結(jié)束后需要關(guān)閉文件。

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

//打開文件FILE* fp=fopen(const char* filename,const char* mode);//兩個參數(shù):打開的文件名和打開方式//關(guān)閉文件fcolse(fp);//打開文件
FILE* fp=fopen(const char* filename,const char* mode);
//兩個參數(shù):打開的文件名和打開方式
//關(guān)閉文件
fcolse(fp);

常見打開文件方式如下:

文件打開方式含義指定文件不存在
“r"(只讀)為了輸入數(shù)據(jù),打開一個文本文件出錯
"w"(只寫)為了輸出數(shù)據(jù),打開一個文本文件建立一個新的文本文件
"a”(追加)向文件文本尾添加數(shù)據(jù)出錯
"rb"(只讀)為了輸入數(shù)據(jù),打開一個二進制文件出錯
"wb"(只寫)為了輸出數(shù)據(jù),打開一個二進制文件建立一個新的二進制文件
"ab"(追加)向二進制文件尾添加數(shù)據(jù)出錯

打開關(guān)閉文本文件示例如下:

該文件以只寫方式打開,當(dāng)代碼路徑下不存在該文本文件時,程序運行會自動生成新的文件;如果以只讀方式打開文件,該文本文件不存在時,程序運行后會顯示打開失敗。

#include<stdio.h>
int main()
{
	FILE* fp = fopen("text1.txt", "w");//打開文件文本
	if (fp == NULL)//判斷是否打開成功
	{
		printf("Open File Error\n");
		return;
	}
	fclose(fp);//關(guān)閉文件文本
	return 0;
}

二、文件的順序讀寫 

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

1、fgetc()和fputc()函數(shù)

  • fgetc()函數(shù)是從指定文件中讀取一個字符,讀取到文件末尾或者讀取失敗時返回EOF。
  • fputc()函數(shù)用法如下:
int fputc(int ch,FLEF* fp);

ch為要寫入的字符,fp為文件指針。

注:每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。

2、fgets()和fputs()函數(shù) 

fgets()函數(shù)用法如下:

char* fgets(char* buf,int n,FILE* fp);

buf為存儲字符串的地址,n為讀取字符串的長度,fp為文件的指針。該函數(shù)每次最多只能讀取一行,遇到\n就會停止讀取,若有多行需要循環(huán)讀取。

fputs()函數(shù)用法如下:

int fputs(const char* str,FILE* fp);

str為要寫入文件的字符串,fp為要操作的文件,返回值為0表示成功。寫入的字符串也是以\n結(jié)束,所以多行寫入需要重復(fù)操作。

3、fscanf()和fprintf()函數(shù)

fscanf()和fprintf()函數(shù)與前面使用的scanf()和printf()函數(shù)功能相似,都是格式化讀寫函數(shù),兩者的區(qū)別在于fscanf()和fprintf()函數(shù)讀寫對象不是鍵盤和顯示器,而是磁盤文件。

兩個函數(shù)原型為:

int fscanf(FILE* fp,char* fromat,……);
int fprintf(FILE* fp,char* format,……);

與scanf()和printf()相比,僅僅多了一個fp參數(shù)。

4、fread()和fwrite()函數(shù)

(1)fread()函數(shù)

用于讀取二進制數(shù)據(jù)

size_t fread(void* buf,size_t size,size_t count,FILE* fp);
  • fread返回實際讀取的完整項目數(shù),如果發(fā)生錯誤或在達到計數(shù)之前遇到文件結(jié)尾,則該值可能小于計數(shù)。使用feof或ferror函數(shù)區(qū)分讀取錯誤和文件結(jié)束情況。如果大小或計數(shù)為0,則fread返回0且緩沖區(qū)內(nèi)容不變。
  • buf為內(nèi)存區(qū)塊的指針,用來存放讀取到的數(shù)據(jù)。
  • size表示每個數(shù)據(jù)塊的字節(jié)數(shù)。
  • count表示要讀取的數(shù)據(jù)塊的個數(shù)。
  • fp文件指針。

(2)fwrite()函數(shù)

size_t fwrite(const void* buf,size_t size,size_t count,FILE* fp);

fwrite返回實際寫入的完整項的數(shù)量,如果發(fā)生錯誤,該數(shù)量可能小于count。buf用來存放要寫入的數(shù)據(jù),其余參數(shù)與fread()寒素相同。

三、文件的隨機讀寫

1、fseek函數(shù)

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

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

第一個參數(shù)為文件指針;第二個參數(shù)為偏移量,正數(shù)表示向右偏移,負數(shù)表示向左偏移;第三個參數(shù)設(shè)定從文件的哪里開始偏移,可能取值:SEEK_CUR、SEEK_END、SEEK_SET。

  • SEEK_SET:文件開頭
  • SEEK_GUR:當(dāng)前位置
  • SEEK_END:文件結(jié)尾

其中SEEK_SET、SEEK_CUR、SEEK_END依次為0、1、2。

2、ftell函數(shù)

計算文件指針相對于起始位置的偏移量

long int ftell(FILE* stream);

3、rewind函數(shù)

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

void rewind(FILE* stream);

四、文本文件和二進制文件

數(shù)據(jù)文件被分為文本文件和二進制文件。

  • 二進制文件:數(shù)據(jù)在內(nèi)存中以二進制的形式存儲,不加轉(zhuǎn)換的輸出到外存。
  • 文本文件:以ASCII字符的形式存儲的文件。如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前進行轉(zhuǎn)換。

數(shù)據(jù)在內(nèi)存中的存儲:字符以ASCII形式存儲;數(shù)值型數(shù)據(jù)既可以用ASCII形式存儲,也可使用二進制形式存儲。

例:正數(shù)10000,以ASCII碼的形式輸出到磁盤,占用五個字節(jié)(每個字符一個字節(jié));而以二進制形式輸出,在磁盤上只占用四個字節(jié)。

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

  • feof()函數(shù)用來判斷文件內(nèi)部指針是否指向文件末尾,當(dāng)指向文件末尾時返回非零值,否則返回零值。
  • ferror()函數(shù)用來判斷文件操作是否出錯,出錯時返回非零值,否則返回零值。

注:在文件讀取過程中,不能使用feof()函數(shù)的返回值來直接判斷文件是否結(jié)束。而是應(yīng)用于當(dāng)文件讀取結(jié)束時,判斷是讀取失敗結(jié)束,還是遇到文件尾結(jié)束。

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

例如:

  • fgetc判斷是否為EOF
  • fgets判斷返回值是否為NULL.

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

例如:

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

六、文件緩沖區(qū)

從內(nèi)存向磁盤輸出數(shù)據(jù)會先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后再一起送到磁盤上。如果從磁盤像計算機讀入數(shù)據(jù),則從磁盤文件中讀取數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序緩沖區(qū)。

 

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

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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評論