C 文件读写 容易疏忽的一个问题
今天需要解決一個(gè)問(wèn)題,將影像瓦片(一堆jpg文件)分別進(jìn)行讀取,并將所有數(shù)據(jù)以文件流的方式存入一個(gè).db的文件中,
同時(shí)將每個(gè)jpg數(shù)據(jù)在db文件中的位置保存下來(lái),作為index存在.idx文件中。
?
其中部分代碼如下(沒(méi)有copy fopen和fclose的部分):
1 char buf[256];for (int i = 0; i < levels; i++) 2 for (int x = 0; x < imageLevels[i][0]; x++)//縱向 3 for (int y = 0; y < imageLevels[i][1]; y++)//橫向 4 { 5 jpgpath = info.tilespath +CPLSPrintf("image\\pyramid\\level%d\\x%03d_y%03d.jpg",i,x,y); 6 if ((fp = fopen(jpgpath,"rb")) != NULL)//jpg file pointer 7 { 8 while((hr = fread(buf,sizeof(char),256,fp)) != 0) 9 { 10 fwrite(buf,sizeof(char),256,fdb); 11 } 12 fseek(fp,0,SEEK_END); 13 14 //seek到文件結(jié)尾 將該位置tell出來(lái) 即為文件大小 15 fwrite(&jpgIndex,sizeof(jpgIndex),1,fidx); 16 //fprintf(fidx,"%I64d",jpgIndex); 17 jpgIndex = jpgIndex + ftell(fp); 18 fclose(fp); 19 20 // struct _stat finfo; 21 // _stat(jpgpath,&finfo); 22 // int s = finfo.st_size; 23 // int ls=9; 24 } 25 else 26 continue; 27 }
?
這段代碼有沒(méi)有錯(cuò)誤? 或許你一眼就看出來(lái)了,可是當(dāng)局者迷,當(dāng)時(shí)我調(diào)試很久才發(fā)現(xiàn),具體錯(cuò)誤后面再說(shuō)。
?
先總結(jié)一個(gè)技巧:如何獲取文件大小?
這里介紹幾種辦法:
1、通過(guò)fseek函數(shù):
fseek(fp,0,SEEK_END); size_t size = ftell(fp);?
2、使用_stat()函數(shù),需要包含頭文件<sys\stat.h>
1 struct _stat finfo; 2 _stat(jpgpath,&finfo); 3 int s = finfo.st_size;?
3、利用filelength函數(shù)
1 FILE* file = fopen(filepath, "rb"); 2 if (file) 3 { 4 int size = filelength(fileno(file)); 5 fclose(file); 6 }4、利用CFile類的函數(shù)
CFile cfile; if (cfile.Open(filepath, CFile::modeRead)) { int size = cfile.GetLength(); }5、利用句柄和CreateFile函數(shù)
HANDLE handle = CreateFile(filepath, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if (handle != INVALID_HANDLE_VALUE) { int size = GetFileSize(handle, NULL); CloseHandle(handle); }?
個(gè)人比較偏愛(ài)前兩種方法。
?
好了 ,該說(shuō)說(shuō)我的錯(cuò)誤了。看看的第一段代碼的第十行,第三個(gè)參數(shù)。懂了吧,其實(shí)是很簡(jiǎn)單的錯(cuò)誤,但是體現(xiàn)出我對(duì)于函數(shù)變量的了解和控制能力欠缺火候。
fwrite(buf,sizeof(char),hr,fdb);?
問(wèn)題雖然很小,但是編程的時(shí)候,很多問(wèn)題和這種類似,我是用二進(jìn)制文件查看寫(xiě)出來(lái)的文件很久之后,才發(fā)現(xiàn)位置有偏移。
開(kāi)始我懷疑是windows寫(xiě)入時(shí)候做了優(yōu)化,將文件偏移到每個(gè)block的開(kāi)頭位置,可是我的結(jié)果文件只有一個(gè).db文件,不應(yīng)該會(huì)被優(yōu)化。
后來(lái)才發(fā)現(xiàn)自己的疏忽,mark~
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/bigbigtree/p/3487044.html
總結(jié)
以上是生活随笔為你收集整理的C 文件读写 容易疏忽的一个问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简单编码
- 下一篇: jQuery以JSONP的访问调用一个W