[問題] fopen()&fread()內容被截斷..

看板C_and_CPP作者 (經濟不景氣,好景不常在)時間12年前 (2012/10/19 15:20), 編輯推噓3(3028)
留言31則, 4人參與, 最新討論串1/1
大家晚安, 我想請問一下fopen_s()及fread()的用法... 因為我想要將某個檔案讀進buffer,之後在分析buffer內的資料.. 但是,奇怪的是,讀進去的檔案竟然只有四分之三... 後來,我將buffer內的資料在寫成一個檔案後才發現這個問題.. 之後,我用Ultraedit開啟原始檔案及產生的檔案相比較下.. 圖片左邊是原始檔案,右邊是從buffer讀出來寫的檔案 http://ppt.cc/HibO (Ultraedit比較圖) http://www.mediafire.com/?kkd6wavnicb4gae (原始檔案) http://www.mediafire.com/?8trfmioiw9k78qo (將buffer寫成檔案) int file_size = 0; string m_Path ="C:\\ProTmp\\QFN64 230551-CU-A"; WIN32_FIND_DATAA file_data;//取得File檔案資訊 HANDLE handle; handle = ::FindFirstFileA(m_Path.c_str(), &file_data); if( handle != INVALID_HANDLE_VALUE ) { ::FindClose(handle); if ( !(file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { file_size = file_data.nFileSizeLow;////取得File檔案大小 } } FILE* fp; char* buffer = new char[file_size+10]; fopen_s(&fp, m_Path.c_str(), "r "); //Open File fread(buffer, 1, file_size, fp);//read File into buffer buffer[file_size] = '\0'; FILE* fw=fopen("C:\\Temp\\Test","wb");//寫成另一個檔案 fwrite(buffer, sizeof(buffer[0]), file_size, fw); 請問一下,是我在用法上哪裡有寫錯嗎??? 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.47.28.75

10/19 23:57, , 1F
rb?
10/19 23:57, 1F

10/20 00:21, , 2F
rb也試過了...結果一樣= =
10/20 00:21, 2F

10/20 00:27, , 3F
你的 file_size 算錯了 http://ppt.cc/rLnF
10/20 00:27, 3F

10/20 00:28, , 4F
(nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.
10/20 00:28, 4F

10/20 00:33, , 5F
(疑!這案例好像沒差?)
10/20 00:33, 5F

10/20 00:35, , 6F
嗯?!我在Debug時,看nFileSizeHigh沒有值..
10/20 00:35, 6F

10/20 00:48, , 7F
話說你的 QFN64 230551-CU-A 到底是資料夾還是檔案?
10/20 00:48, 7F

10/20 00:48, , 8F
你的程式碼是當資料夾看,上傳空間下載下來是檔案耶
10/20 00:48, 8F

10/20 00:49, , 9F
是檔案,我把副檔名拿掉了..
10/20 00:49, 9F

10/20 00:49, , 10F
不過,應該不影響讀取檔案吧= =
10/20 00:49, 10F

10/20 00:50, , 11F
那你程式碼邏輯就不對啦!裡面的 file_size 是針對
10/20 00:50, 11F

10/20 00:51, , 12F
更正。程式碼邏輯是把 QFN64 230551-CU-A 當資料夾進去找
10/20 00:51, 12F

10/20 00:51, , 13F
檔案,還是你先把你的問題再簡單過?FindFirstFile 拿掉?
10/20 00:51, 13F

10/20 00:53, , 14F
但是,我將產生的Test檔案丟回去讀,產生另一個Test1(假設)
10/20 00:53, 14F

10/20 00:53, , 15F
讀取前跟讀取後的檔案內容又都一樣..
10/20 00:53, 15F

10/20 00:57, , 16F
嗯.我第一次聽 FindFirstFile可以拿檔案非路徑當引數的...
10/20 00:57, 16F

10/20 00:59, , 17F
明天來試一下把FindFirstFile拿掉試試看
10/20 00:59, 17F

10/20 01:00, , 18F
感謝EdisonX^^
10/20 01:00, 18F

10/20 01:09, , 19F
話說我這裡改過蠻正常的 http://ideone.com/6sWWN
10/20 01:09, 19F

10/20 08:37, , 20F
試過EdisonX的Code產生的檔案是正確的,但還是不了解為何會
10/20 08:37, 20F

10/20 08:38, , 21F
這樣..是因為陣列大小切割的關係嗎??
10/20 08:38, 21F

10/20 16:24, , 22F
fopen_s(&fp, m_Path.c_str(), "r "); //Open File
10/20 16:24, 22F

10/20 16:25, , 23F
上面這行的"r "改成"rb"就不會錯了
10/20 16:25, 23F

10/20 16:26, , 24F
"r"表示檔案是文字檔,"rb"表示是二進位檔。
10/20 16:26, 24F

10/20 16:32, , 25F
原因是因為用文字模式去讀二進位檔時,讀到 0x1A 就會判定
10/20 16:32, 25F

10/20 16:33, , 26F
是檔案的結尾,以你的 case,原檔案的 0x13E 就是 0x1A。
10/20 16:33, 26F

10/20 23:02, , 27F
linotwo前輩,我早上試了一次,剛又試了一次改成"rb"..
10/20 23:02, 27F

10/20 23:04, , 28F
改成"rb"還是一樣被截斷..http://ppt.cc/e27G
10/20 23:04, 28F

10/20 23:05, , 29F
左邊的是原始檔,右邊的是改為"rb"後寫出的檔案..
10/20 23:05, 29F

10/21 01:30, , 30F
從你上面的程式碼看不出來你有沒有漏掉 fclose(fw)
10/21 01:30, 30F

10/21 01:31, , 31F
如果漏掉的話也有可能會被截斷。
10/21 01:31, 31F
文章代碼(AID): #1GWM-ly8 (C_and_CPP)