VC實現一次性讀取檔案全部內容
阿新 • • 發佈:2019-02-07
用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; }