1. 程式人生 > >c語言檔案操作函式講解

c語言檔案操作函式講解

c語言檔案操作

什麼是檔案

磁碟上的檔案是檔案。包含程式檔案和資料檔案。
程式檔案:包括.c檔案,和可執行檔案(exe.檔案)。
資料檔案:程式從檔案中讀取,或者輸出檔案,比如存放資料的txt檔案。

檔名

檔名包含檔名+檔案主幹+檔案字尾。

檔案型別

檔案型別有文字檔案(資料的組織形式)和二進位制檔案(以二進位制存放的檔案)。

檔案指標

緩衝檔案系統中,關鍵的概念是“檔案型別指標”,簡稱“檔案指標”。
每個被使用的檔案都在記憶體中開闢了一個相應的檔案資訊區,用來存放檔案的相關資訊(如檔案的名字,檔案狀態
及檔案當前的位置等)。這些資訊是儲存在一個結構體變數中的。該結構體型別是有系統宣告的,取名FILE.

FILE* pf;//檔案指標變數

介紹完關於檔案的知識後我們開始一起來學習和操作檔案有關的函式:

1.fopen函式(開啟一個檔案)fclose(關閉一個檔案)

函式庫中的宣告:
FILE *fopen( const char *filename, const char *mode );
int fclose( FILE *stream );
fclose的引數為檔案指標。
fopen第一個引數為檔名字,第二個為開啟的型別,這裡我們又要提到什麼是開啟的方式

檔案使用方式 含義 如果指定檔案不存在
“r”(只讀) \ 為了輸入資料, \ 出錯
“w”(只寫) \ 為了輸出資料, \ 建立一個新檔案
“a”(追加) \ 為檔案尾部新增資料 \ 出錯
“rb” \ 為了輸入資料開啟二進位制檔案 \ 出錯
“wb” \ 為了輸出資料開啟二進位制檔案 \ 建立一個新檔案

清楚了開啟方式之後我們來看程式碼中怎麼使用這倆個函式

#include<stdio.h>
int main()
{
	FLIE* p;//定義一個檔案指標
    p = fopen("test.txt","w");//假設我們的工程下有一個叫test。txt的檔案,開啟方式為只讀
	if(p != NULL);
	{
		//操作檔案
		fclose(p);
	}
	return 0;
}

2.字元輸入函式fgetc

函式宣告:int fgetc( FILE *stream );//引數為檔案流

int main()
{
	FILE* pf = fopen(
"test.txt", "r"); int ch = 0 ; if(pf == NULL) { printf("%s\n", strerror(errno)); return 0; } //讀檔案 ch = fgetc(pf);//向檔案輸入一個字元 //putchar(ch); printf("%c\n", ch); fclose(pf); pf = NULL; return 0; }

3.字元輸出函式fputc

函式宣告:int fputc( int c, FILE *stream );引數為要輸出那個字元,和檔案流

#include <stdio.h>
#include <errno.h>//報錯判斷標頭檔案
#include <string.h>
int main()

{

	FILE* pf = fopen("test.txt", "w");
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}

	//寫檔案
	fputc('b', pf);//向檔案寫入一個字元
	fputc('i', pf);
	fputc('t', pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

4.文字行輸出函式fputs

函式宣告:int fputs( const char *string, FILE *stream );引數為要輸出的字串和檔案流
返回值:Each of these functions returns a nonnegative value if it is successful. On an error, fputs returns EOF, and fputws returns WEOF(成功返回一個非負值)

int main()
{
	FILE* pf = fopen("test.txt", "w");
	int ch = 0 ;
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	fputs("hello world", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

5.文字行輸入函式fgets

函式宣告:char *fgets( char *string, int n, FILE *stream );引數為資料儲存的位置,讀取的最大字元數和檔案流
返回值:Each of these functions returns string. NULL is returned to indicate an error or an end-of-file condition. Use feof or ferror to determine whether an error occurred 這些函式都返回字串。返回NULL表示錯誤或檔案結束條件。使用feof或ferror來確定是否發生了錯誤

int main()
{
	FILE* pf = fopen("test.txt", "r");
	char arr[20] = {0};
	int ch = 0 ;
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	fgets(arr, 20, pf);
	printf("%s", arr);
	fgets(arr, 20, pf);
	printf("%s", arr);
	fgets(arr, 20, pf);
	printf("%s", arr);
	fclose(pf);
	pf = NULL;
	return 0;
}

6.格式化輸入函式fscanf

函式宣告:int fscanf( FILE *stream, const char *format [, argument ]… );引數是檔案流和格式控制字串
函式返回值:每個函式返回成功轉換和分配的欄位數;返回值不包括已讀取但未分配的欄位。返回值0表示沒有分配任何欄位。如果發生錯誤,或者在第一次轉換之前到達了檔案流的末尾,則返回值為fscanf的EOF或fwscanf的WEOF

struct S
{
	char name[20];
	int age;
};
int main()
{
	struct S s = {0};
	FILE* pf = fopen("text.txt","r");
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//讀
	fscanf(pf, "%s %d", s.name, &(s.age));	
	printf("%s %d\n", s.name, s.age);
	fclose(pf);
	pf = NULL;
	return 0;
}

7.格式化輸出函式fprintf

函式宣告:int fprintf( FILE *stream, const char *format [, argument ]…);引數是檔案流和格式控制字串
函式返回值:返回寫入的位元組數。返回寫入的寬字元數。當出現輸出錯誤時,每個函式返回一個負值。

int main()
{
	struct S s = {"zhangsan", 20};
	
	FILE* pf = fopen("C:\\ClassCode\\51班\\test_11_18\\test.txt","w");
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//寫
	fprintf(stdout, "%s %d", s.name, s.age);

	fclose(pf);
	pf = NULL;
	return 0;
}

7.二進位制輸入 函式fread

函式宣告:size_t fread( void *buffer, size_t size, size_t count, FILE *stream );引數第一個為資料儲存的位置,第二個為目標位元組大小,第三個為元素的最大數量,第四個引數為檔案流
返回值:fread返回實際讀取的完整項的數量

int main()
{
	struct S s = {0};
	FILE* pf = fopen("test.txt", "rb");
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//讀操作
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d\n", s.name, s.age);
	fclose(pf);
	pf = NULL;
	return 0;
}

8.二進位制輸出 函式fwrite

函式宣告:size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );引數第一個為資料儲存的位置,第二個為目標位元組大小,第三個為元素的最大數量,第四個引數為檔案流
返回值:fwrite返回實際寫入的完整項的數量,如果發生錯誤,該數量可能小於計數。

int main()
{
	struct S s = {"張三", 20};
	FILE* pf = fopen("test.txt", "wb");
	if(pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//寫操作
	fwrite(&s, sizeof(struct S), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

以上就是檔案操作幾個最常用到的函式,希望次部落格能幫助大家進一步認識檔案操作函式,當然還有一些函式沒有列舉出來,希望讀者可以自己學習發掘。