1. 程式人生 > >C++__檔案讀取與寫入

C++__檔案讀取與寫入

                                             檔案讀取與寫入

一:C中檔案的讀取與寫入操作

定義於標頭檔案<stdio.h>中

檔案存取

重點函式:fopen——開啟檔案;fclose——關閉檔案

①fopen函式原型:FILE* fopen(const char* filename,const char*

mode);

引數詳解:

filename——將檔案流關聯到的檔名

mode——以空字元結尾的字串,用以確認檔案存取模式

 

②fclose函式原型:int fclose(FILE* stream);

關閉給定的檔案流。任何未寫入的緩衝資料都會被重新整理到作業系統。任何未讀緩衝資料都將被丟棄。

 

直接輸入/輸出

重點函式:fread——從檔案中讀取;fwrite——寫入檔案

①fread函式原型:size_t fread(void* buffer,size_t size,size_t count,FILE* stream);

引數詳解:

buffer——指向儲存讀取物件的陣列的指標

size——每個物件的大小(以位元組為單位)

count——要讀取物件的數量

stream——讀取的檔案流

 

②fwrite函式原型:size_t fwrite(const void* buffer,size_t size,size_t count,FILE* stream);

引數詳解:

buffer——指向陣列中要寫入的第一個物件的指標

size——每一個物件的大小

count——要寫入的物件的數量

stream——指向輸出流的指標

 

檔案定位

重點函式:ftell

——返回當前檔案位置指示器;fseek——將檔案位置指示器移動到檔案的指定位置(移動檔案流的讀寫位置)。

①ftell函式原型:long ftell(FILE* stream);

返回檔案流的檔案位置指示器。

如果流以二進位制模式開啟,這個函式得到的值是檔案開頭的位元組數。

如果流以文字模式開啟,則此函式返回的值是未指定的,並且僅作為fseek()的輸入有意義。

 

fseek函式原型:int fseek(FILE* stream,long offset,int origin);

引數詳解:

stream——要修改的檔案流

offset——相對於原點移動位置的字元數

origin——新增偏移量的位置。它可以有以下值之一:SEEK_SETSEEK_CURSEEK_END

引數offset 為根據引數origin來移動讀寫位置的位移數。引數 origin為下列其中一種:

SEEK_SET 從距檔案開頭offset 位移量為新的讀寫位置. SEEK_CUR 以目前的讀寫位置往後增加offset 個位移量.

SEEK_END 將讀寫位置指向檔案尾後再增加offset 個位移量. 當origin 值為SEEK_CUR 或

SEEK_END 時, 引數offset 允許負值的出現.

下面是較特別的使用方式:

1) 欲將讀寫位置移動到檔案開頭時:fseek(FILE *stream, 0, SEEK_SET);

2) 欲將讀寫位置移動到檔案尾時:fseek(FILE *stream, 0, 0SEEK_END);

返回值:當呼叫成功時則返回0, 若有錯誤則返回-1, errno 會存放錯誤程式碼.

附加說明:fseek()不像lseek()會返回讀寫位置, 因此必須使用ftell()來取得目前讀寫的位置.

 

使用範例:

//以二進位制的方式讀取出文字檔案存到vector容器中。
#include <cstdio>

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

static size_t GetFileSize(FILE* file)
{
	fseek(file,0,SEEK_END);
	size_t read_len=ftell(file);
	fseek(file,0,SEEK_SET);
	return read_len;
}

static size_t GetFileSize(const char* file_path)
{
	FILE* file=fopen(file_path,"rb");
	if(file==nullptr) {
		return 0;
	}
	size_t size=GetFileSize(file);
	fclose(file);
	return size;
}

//呼叫該函式即可以二進位制的形式讀取出檔案位元組儲存到vector容器中。
std::vector<unsigned char> ReadFromFile(const char* file_path) {
	FILE* file=fopen(file_path,"rb");
	std::vector<unsigned char> result;
	if(file==nullptr) {
		return result;
	}
	
	//獲取檔案大小,儘量一次讀完
	size_t file_size=GetFileSize(file);
	if(file_size!=0) {
		result.resize(file_size);
		size_t n=fread(&result[0],1,file_size,file);
		assert(n<=file_size);
		if(n!=file_size) {
			result.resize(n);	
		}
	}
	
	//在讀取過程中,有可能檔案大小有變化,再嘗試讀取。
	const size_t read_len=1024;
	char buf[read_len];
	for(;;) {
		size_t n=fread(buf,1,read_len,file);
		result.insert(result.end(),buf,buf+n);
		if(n<read_len) {
			break;
		}
	}
	fclose(file);
	return result;
}

 

二:C++中檔案的讀取與寫入操作

請參考博主 追求執著的博文https://blog.csdn.net/kingstar158/article/details/6859379(總結十分到位)(感謝博主)