讀取一個文件的全部內容,有很多種方法,在QT下可以用QFile,非常方便;在VS下暫時知道的有兩種,一種是fopen文件,一種是文件流操作ifstream。分別簡單介紹一下實現:(打開方式都要加上二進制,否則中文會出錯)
1.用fopen實現
char *charFilePath=“abc.txt";
FILE *pfile=fopen(charFilePath,"rb");//打開文件,返回文件操作符
char *pread;
size_t result;
if(pfile)//打開文件一定要判斷是否成功
{
fseek(pfile,0,SEEK_END);//將文件內部的指針指向文件末尾
long lsize=ftell(pfile);//獲取文件長度,(得到文件位置指針當前位置相對於文件首的偏移字節數)
rewind(pfile);//將文件內部的指針重新指向一個流的開頭
pread=(char *) malloc(lsize*sizeof(char)+1);//申請內存空間,lsize*sizeof(char)是為了更嚴謹,16位上char占一個字符,其他機器上可能變化
//用malloc申請的內存是沒有初始值的,如果不賦值會導致寫入的時候找不到結束標志符而出現內存比實際申請值大,寫入數據后面跟隨亂碼的情況
memset(pread,0,lsize*sizeof(char)+1);//將內存空間都賦值為‘\0’
result=fread(pread,1,lsize,pfile);//將pfile中內容讀入pread指向內存中
}
QString qstr=QString::fromLocal8Bit(pread);//要進行轉碼,否則中文字符無法顯示
fclose(pfill);//關掉文件操作符,和句柄一樣,有open就一定有close
free(pread);//釋放內存
pread=NULL;//指針不再使用,一定要“刪除”,防止產生野指針
2.用ifstream實現:
char *charFilePath=“abc.txt";
char *preadd;
std::ifstream inFile(charFilePath,std::ifstream::binary);//打開文件,返回文件流操作符
if(inFile)
{
inFile.seekg(0,inFile.end);//指針指向文件尾部,0表示離end的偏移量,如果是1就是指向倒數第一個
int length=inFile.tellg();//返回文件的長度
inFile.seekg(0,inFile.beg);//指針指向文件首地址
preadd=(char *) new char[length+1]; //new在c++中使用會直接給分配的內存賦值,但char *屬於C類型,所以也需要memset
memset(preadd,0,length+1);
/*int len=strlen(preadd);自己用來查看申請內存后preadd的內存大小,加了memset將內存全部給'\0',得到的len=0;如果沒有memset會是一個比length+1的數*/
inFile.read (preadd,length);//讀取文件,存入緩存器
}
QString qqstr=QString::fromLocal8Bit(preadd);//要進行轉碼,否則中文字符無法顯示
inFile.close();//關掉文件操作符,和句柄一樣,有open就一定有close
delete [] preadd;//釋放內存,new對應的是delete,中間的[]不能省略
pread=NULL;//指針不再使用,一定要“刪除”,防止產生野指針
