1. 程式人生 > >VC實現一次性讀取檔案全部內容

VC實現一次性讀取檔案全部內容

用VC實現一次性讀取檔案裡全部內容。需要用到fseek和ftell函式。

feek函式

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

作用:移動檔案流的讀寫位置

包含標頭檔案:#include <stdio.h>

引數:

返回值:當呼叫成功時則返回0,若有錯誤則返回-1。

第一個引數:stream為已開啟的檔案指標
第二個引數:offset為偏移量
第三個引數:origin設定從檔案讀寫指標的哪裡開始偏移,取值有:SEEK_SET、SEEK_CUR、 SEEK_END 
SEEK_SET: 檔案開頭
SEEK_CUR: 當前位置
SEEK_END: 檔案結尾

fseek函式一般用於二進位制檔案,也可以用於文字檔案。用於文字檔案操作時,需特別注意回車換行的情況:因為在一般在編輯器如UltraEdit中,回車換行視為兩個字元0x0D和0x0A,但真實的檔案讀寫和定位時卻按照一個字元0x0A進行處理,因此碰到此類問題時,可以考慮將檔案整個讀入記憶體,然後在記憶體中手工插入0x0D的方法,這樣可以達到較好的處理效果。

ftell函式:

原型: long ftell(FILE * stream)

作用:獲取檔案讀寫指標的當前位置

包含標頭檔案:#include <stdio.h>

引數:stream為已開啟的檔案指標

返回值:成功則返回當前的讀寫位置,失敗返回 -1。


程式碼如下:

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

//一次性讀取檔案中的全部內容
std::string readfile(char * filename)
{
	std::string content_str;
	char * str_tmp;
	FILE * f;
	long length;
	//以二進位制形式開啟檔案
	f = fopen(filename, "rb");
	if (NULL == f)
	{
		printf("Open file fail\n");
		return NULL;
	}
	//把檔案的位置指標移到檔案尾
	fseek(f, 0, SEEK_END);
	//獲取檔案長度;
	length = ftell(f);
	//把檔案的位置指標移到檔案開頭
	fseek(f, 0, SEEK_SET);
	str_tmp = (char *)malloc((length + 1) * sizeof(char));
	fread(str_tmp, 1, length, f);
	str_tmp[length] = '\0';
	fclose(f);
	
	if(str_tmp)
	{
		content_str = str_tmp;
		free(str_tmp);
		str_tmp = NULL;
	}
	return content_str;
}

int main()
{
	char * filename = "test.txt";
	FILE * f;
	f = fopen(filename, "wb");
	if (NULL == f)
	{
		printf("Open file fail\n");
		return -1;
	}
	//寫檔案
	fprintf(f, "This is the first line.\nThis is the second line.\n");
	fflush(f);
	fclose(f);

	std::string content_str = readfile(filename);
	printf("%s\n",content_str.c_str());

	return 0;
}