日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C 文件读写 容易疏忽的一个问题

發布時間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C 文件读写 容易疏忽的一个问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  今天需要解決一個問題,將影像瓦片(一堆jpg文件)分別進行讀取,并將所有數據以文件流的方式存入一個.db的文件中,

同時將每個jpg數據在db文件中的位置保存下來,作為index存在.idx文件中。

?

其中部分代碼如下(沒有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到文件結尾 將該位置tell出來 即為文件大小 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 }

?

這段代碼有沒有錯誤?  或許你一眼就看出來了,可是當局者迷,當時我調試很久才發現,具體錯誤后面再說。

?

先總結一個技巧:如何獲取文件大小?


這里介紹幾種辦法:

1、通過fseek函數:

fseek(fp,0,SEEK_END); size_t size = ftell(fp);

?

2、使用_stat()函數,需要包含頭文件<sys\stat.h>

1 struct _stat finfo; 2 _stat(jpgpath,&finfo); 3 int s = finfo.st_size;

?

3、利用filelength函數

1 FILE* file = fopen(filepath, "rb"); 2 if (file) 3 { 4 int size = filelength(fileno(file)); 5 fclose(file); 6 }

4、利用CFile類的函數

CFile cfile; if (cfile.Open(filepath, CFile::modeRead)) { int size = cfile.GetLength(); }

5、利用句柄和CreateFile函數

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); }

?

個人比較偏愛前兩種方法。

?

好了 ,該說說我的錯誤了??纯吹牡谝欢未a的第十行,第三個參數。懂了吧,其實是很簡單的錯誤,但是體現出我對于函數變量的了解和控制能力欠缺火候。

fwrite(buf,sizeof(char),hr,fdb);

?

問題雖然很小,但是編程的時候,很多問題和這種類似,我是用二進制文件查看寫出來的文件很久之后,才發現位置有偏移。

開始我懷疑是windows寫入時候做了優化,將文件偏移到每個block的開頭位置,可是我的結果文件只有一個.db文件,不應該會被優化。

后來才發現自己的疏忽,mark~

?

?

?

?

?

轉載于:https://www.cnblogs.com/bigbigtree/p/3487044.html

總結

以上是生活随笔為你收集整理的C 文件读写 容易疏忽的一个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。