java实现fread_fread函数读取到的数据和实际数据不一样
背景
最近項(xiàng)目中弄個(gè)接口,涉及到二進(jìn)制文件處理,剛開(kāi)始對(duì)讀寫(xiě)文件夾這塊沒(méi)有太注意,結(jié)果最后浪費(fèi)了一些時(shí)間。
文件大小600+k(不到一兆),二進(jìn)制存儲(chǔ),總長(zhǎng)度638208個(gè)字節(jié),如下:
正文
最初,通過(guò)fopen打開(kāi)文件,如下:
/* 打開(kāi)文件*/
if((fp_input = fopen(strFilePath.GetBuffer(), "r")) == NULL)
{
MessageBox("Can't open intput file!");
}
然后獲取文件的總長(zhǎng)度,如下:
/* 獲取文件總長(zhǎng)度(總字節(jié)數(shù)) */
long filesize(FILE *stream)
{
long curpos, length;
curpos = ftell(stream);
fseek(stream, 0L, SEEK_END);
length = ftell(stream);
fseek(stream, curpos, SEEK_SET);
return length;
}
一切看似都很正常,文件能打開(kāi),總長(zhǎng)度獲取也沒(méi)問(wèn)題,然后就是通過(guò)fread讀取文件內(nèi)容了,如下:
/* 讀取文件內(nèi)容 */
if(fread(str_file, 1, flength, fp_input) == 0)
{
MessageBox("Can't read file!");
return;
}
OK,下面就開(kāi)始根據(jù)接口格式解析文件內(nèi)容了。
問(wèn)題也就出來(lái)了,明明文件總長(zhǎng)度為638208個(gè)字節(jié),但每次處理到629000+個(gè)字節(jié)后程序就崩掉了。開(kāi)始我以為是我解析代碼里面內(nèi)存沒(méi)處理好造成內(nèi)存溢出了,然后我就把所有分配內(nèi)存的地方注釋掉,發(fā)現(xiàn)還有問(wèn)題。調(diào)了一段時(shí)間后,我就在函數(shù)入口的地方直接偏到629000+的位置看了內(nèi)存里面的內(nèi)容,發(fā)現(xiàn)竟然為空。現(xiàn)在就定位了問(wèn)題出在前面的讀文件,往前看代碼,發(fā)現(xiàn)fopen的時(shí)候用的“r”,改成“rb”,重新跑了下程序。OK了,OK了,OK了,為什么?
為什么用“r”和“rb”都能讀取文件內(nèi)容,但讀出來(lái)的東西卻不一樣了?
帶著疑問(wèn),在網(wǎng)上搜了一把(之前確實(shí)沒(méi)注意過(guò)這個(gè)問(wèn)題,也沒(méi)遇到過(guò)),發(fā)現(xiàn)真有這樣的問(wèn)題,原因如下:
先看一段MSDN:
If the given stream is opened in text mode, carriage return–linefeed pairs are replaced with single linefeed characters. The replacement has no effect on the file pointer or the return value.
就是說(shuō)如果按“文本模式”打開(kāi)一個(gè)文件,那么在讀入的時(shí)候,Windows默認(rèn)的換行符CR+LF就會(huì)轉(zhuǎn)換成一個(gè)單個(gè)的LF。
引自:https://blog.csdn.net/tgdzsjh/article/details/32702073
r遇到0x0d后面沒(méi)有0x0a會(huì)自動(dòng)加一個(gè),遇到0x1a會(huì)忽略后面的內(nèi)容
rb不會(huì)
r 讀到\r\n會(huì)改為\n,讀到\x1a會(huì)返回EOF
rb 讀到什么返回什么,讀到文件末尾才會(huì)返回EOF
引自:https://blog.csdn.net/cattylll/article/details/7107089
總結(jié)
以上是生活随笔為你收集整理的java实现fread_fread函数读取到的数据和实际数据不一样的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 成都晶肤做全切双眼皮要多少钱?价目表哪里
- 下一篇: give money是哪首歌啊?