锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓婃璇存棩鏈搗鍟歌鎶ョ殑鏃跺欙紝紼嬪簭鍑洪敊銆傚湪瑙f瀽浠g爜鐨勬椂鍊欙紝鍙戠幇浜哅FC涓殑涓涓狟ug銆?/p>
涓銆傞棶棰樼殑浜х敓銆?/p>
榪欎釜紼嬪簭錛岀敤鏉ュ鐞嗘棩鏈悇縐嶅ぉ姘旈鎶ユ暟鎹紝鍖呮嫭鐏懼鐨勯鎶ャ傚鏋滃湴闇囷紝鍙伴涔嬬被鐨勮嚜鐒剁伨瀹沖埌鏉ワ紝紼嬪簭浼氭妸棰勬姤鏁版嵁榪涜澶勭悊錛岀敓鎴愮浉搴旂殑璀︽姤淇℃伅錛屽茍鍦ㄧ數(shù)瑙嗕笂闈㈡樉紺烘粴鍔ㄧ殑瀛楀箷鏉ユ彁紺恒傜▼搴忔湰韜紝鏄嚑騫村墠鍏徃鐨勫叾浠栦漢鍐欑殑銆傞噷闈㈡湁娑夊強鍒版枃浠惰鍐欑殑鍦版柟錛屾湁寰堝鍦版柟錛岀敤浜哅FC涓嚜甯︾殑鏂囦歡璇誨啓綾籆StdioFile銆?/p>
CStdioFile榪欎釜鏂囦歡璇誨啓綾伙紝浼拌澶у閮戒笉闄岀敓銆傝繖涓被鐨勭埗綾伙紝鏄疌File綾匯侰StdioFile綾繪湰韜殑鍔熻兘涔熷緢綆鍗曘侰StdioFile綾繪湁涓涓垚鍛樺嚱鏁版槸ReadString錛屽嚱鏁扮殑瀹氫箟濡備笅錛?/p>
MSDN瀹氫箟濡備笅http://msdn.microsoft.com/library/x5t0zfyf(VS.80).aspx錛?pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; height: 118px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">virtual LPTSTR ReadString(__out_ecount_z(nMax) LPTSTR lpsz, __in UINT nMax);
virtual BOOL ReadString(CString& rString);
BOOL ReadString(CString& rString);
throw( CFileException );
Return Value
A pointer to the buffer containing the text data. NULL if end-of-file was reached without reading any data; or if boolean, FALSE if end-of-file was reached without reading any data.
ReadString鍑芥暟鑳界洿鎺ヨ鍙栨枃鏈腑鐨勪竴琛屾暟鎹埌CString涓紝寰堟柟渚褲傝鍒版枃浠剁粨灝撅紝娌℃湁璇誨嚭浠諱綍鏁版嵁鐨勬椂鍊欙紝榪斿洖FALSE銆傚緢綆鍗曠殑鍑芥暟錛屼絾鎭版伆鏄繖涓嚱鏁版湁Bug銆?/p>
紼嬪簭鍦ㄥ鐞嗘暟鎹殑鏃跺欙紝浼氱敓鎴愪竴浜涗復鏃舵枃浠訛紝鐒跺悗浼氳鍙栬繖浜涗復鏃舵枃浠朵腑鐨勬暟鎹紝璇誨彇鎿嶄綔錛屾鏄敤鐨凜StdioFile鐨凴eadString鍑芥暟銆傝鍙栨祦紼嬪緢綆鍗曪細
while(dFile.ReadString(Str_temp))
{doSomething();}
褰撴椂鐨勭幇璞′負錛岃鍙栧埌鏈鍚庝竴琛岋紝鎬繪槸鐩存帴榪斿洖FALSE錛屾庝箞涔熻涓嶅嚭鏈鍚庝竴琛屾潵銆傜湅浜嗙湅鏂囦歡鐨勬渶鍚庝竴琛岋紝鍖呭惈2176涓瓧絎︾殑鏁版嵁錛屾病鏈夋崲琛岀銆傛病鏈変換浣曞紓甯稿晩銆傚綋鏃舵病鎯沖埌鏄疢FC鐨凚ug錛屽洜涓轟互鍓嶆湁榪欐牱閭f牱鐨勬瘺鐥咃紝澶氭暟鏄鎶ユ暟鎹湰韜湁闂錛屾墍浠ヨ繖嬈′篃鏄厛鍒嗘瀽鏁版嵁浜嗐傚垎鏋愭潵鍒嗘瀽鍘伙紝娌″彂鐜拌繖嬈$殑鏁版嵁鏈変粈涔堝紓甯搞傚悗鏉ュ彂鐜板鏋滄渶鍚庝竴琛岀殑鏂囦歡涓嶆槸2176涓瓧絎︼紝灝辮兘姝e父璇誨嚭鏉ャ傚浜嗘簡錛?176涔熶笉鏄粈涔堢壒孌婇暱搴﹀晩銆傚疄楠屼簡鍑犳鍚庯紝瑙夌殑鏄湪涓嶅鍔層傝帿闈炴槸MFC鐨凚ug錛?/p>
浜屻傚彂鐜伴棶棰樻墍鍦?/p>
鍐沖畾鐪嬬湅MFC鐨勪唬鐮佸啀璇淬傚仛浜嗕釜綆鍗曠殑嫻嬭瘯紼嬪簭錛岃窡鍒癕FC浠g爜閲屼竴鐪嬶紝鏋滅劧鏄疢FC鐨勯棶棰橈紒嫻嬭瘯浠g爜濡備笅錛?/p>
CStdioFile dFile;dFile.Open("text.txt",CFile::modeRead);
CString str;while (dFile.ReadString(str) != FALSE )
{printf("%s", str);
}dFile.Close();
嫻嬭瘯浠g爜寰堢畝鍗曪紝璇籺ext.txt鏂囦歡涓殑姣忎竴琛岋紝鐒跺悗鎵撳嵃鍑烘潵銆傝繕鏄?176涓瓧絎﹀氨涓嶈銆傜‘瀹氫簡涓嶆槸鏁版嵁鐨勯棶棰橈紝灝辨槸MFC浠g爜鏈韓鐨凚ug銆?/p>
MFC鐨凴eadString浠g爜濡備笅錛氾紙涓枃鏄垜鍔犵殑娉ㄩ噴錛?/p>
BOOL CStdioFile::ReadString(CString& rString){ASSERT_VALID(this);
rString = &afxChNil; // empty string without deallocating
const int nMaxSize = 128; //涓存椂瀛楃涓茬殑闀垮害LPTSTR lpsz = rString.GetBuffer(nMaxSize); //淇濆瓨姣忔璇誨彇鍒扮殑瀛楃涓插埌CString涓?/span>
LPTSTR lpszResult; //鎸囧悜姣忔璇誨埌鐨勫瓧絎︿覆
int nLen = 0;
for (;;)
{lpszResult = _fgetts(lpsz, nMaxSize+1, m_pStream); //璇誨彇鎿嶄綔
rString.ReleaseBuffer();// handle error/eof case
if (lpszResult == NULL && !feof(m_pStream))
{clearerr(m_pStream);AfxThrowFileException(CFileException::generic, _doserrno,m_strFileName);}// if string is read completely or EOF
if (lpszResult == NULL ||
(nLen = lstrlen(lpsz)) < nMaxSize ||lpsz[nLen-1] == '\n')break;
nLen = rString.GetLength();lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen; //浣嶇疆鍚庣Щ
}// remove '\n' from end of string if present
lpsz = rString.GetBuffer(0);nLen = rString.GetLength();if (nLen != 0 && lpsz[nLen-1] == '\n') // 鏈鍚庣粨鏋滀腑錛屽幓鎺夊洖杞︾rString.GetBufferSetLength(nLen-1);return lpszResult != NULL; // 榪欓噷灝辨槸Bug鐨勫叧閿傝繑鍥炲間笉瀵癸紒}
鍙互鐪嬪埌錛孯eadString鐨勫簳灞傦紝鏄敤fgets鏉ヨ鍙栨枃浠剁殑銆傚湪鍐呴儴錛屾瘡嬈¤鍙?28涓瓧絎﹀埌CString涓紝鐒跺悗浣嶇疆鍚庣Щ錛屽弽澶嶈鍙?28涓瓧絎︼紝鐩村埌閬囧埌鍥炶濺絎︽垨鑰呮枃浠剁粨鏉熴傛渶鍚庢妸鍥炶濺絎﹀幓鎺夛紝榪斿洖涓涓狢String銆傚叾涓紝lpszResult涔熸寚鍚戞瘡嬈¤鍑虹殑瀛楃涓層?/p>
榪欓噷灝辯湅鍑洪棶棰樻墍鍦ㄤ簡錛?176涓瓧絎︼紝姝eソ鏄?28鐨?7鍊嶏紒涔熷氨鏄錛?font color="#ff0000">鍙鏂囦歡鏈鍚庝竴琛屾槸128鍊嶆暟涓瓧絎︼紝灝變竴瀹氫細榪斿洖FALSE銆?/strong>
涓轟粈涔堜細榪欐牱鍛紝鍥犱負ReadString鍦ㄦ瘡嬈¤鍙?28涓瓧絎︾殑鏃跺欙紝鐢╨pszResult鎸囧悜璇誨彇鍒扮殑瀛楃涓層傚鏋滆婊′簡128涓瓧絎︼紝灝辯戶緇錛屽鏋滆鍒扮殑瀛楃涓嶅128涓紝閭d箞灝辯粨鏉熻鍙栥?/font>
褰撲竴琛屾暟鎹濂戒負128鐨勫嶆暟錛屽張娌℃湁鍥炶濺絎︾殑鏃跺欙紝浼氬彂鐢熶粈涔堝憿錛熸瘮濡傛渶鍚庝竴琛屾暟鎹槸128涓紝閭d箞錛岃涓嬈?28涓瓧絎︼紝浼氱戶緇涓嬩竴嬈★紝浣嗘槸涓嬩竴嬈$殑璇誨彇錛屼粈涔堜篃娌℃湁璇誨埌錛宭pszResult灝辨寚鍚慛ULL錛屾渶鍚庣殑榪斿洖鍊鹼紝鏄痳eturn lpszResult != NULL; 鎵浠ヨ繑鍥濬ALSE銆?/font>
浣嗕箣鍓嶈鍒扮殑128涓瓧絎︼紝宸茬粡鍦–String閲岄潰浜嗐?/font>涔熷氨鏄瀹為檯涓婅鍙栧凡緇忔垚鍔熶簡錛屼絾榪樻槸榪斿洖浜咶ALSE銆傝繑鍥炲間笉鎭板綋錛?/font>
Bug鐨勬弿榪幫細褰撴枃浠剁殑鏈鍚庝竴琛屾暟鎹紝姝eソ鏄?28鐨勫嶆暟涓瓧絎︾殑鏃跺欙紝鐢?/font>ReadString璇誨彇錛屼竴瀹氫細榪斿洖FALSE銆備絾瀹為檯涓婅鍙栨槸鎴愬姛鐨勶紝榪斿洖鐨凜String涓殑鏁版嵁鏄紜殑錛侊紙VC6.0涓瓨鍦ㄨ繖涓狟ug錛孷S2005涓紝娌℃湁榪欎釜Bug錛?/font>
榪欎釜Bug錛屽彧浼氬獎鍝嶅埌鏈鍚庝竴琛屾暟鎹傚洜涓哄鏋滄湁鎹㈣絎︾殑瀛樺湪錛宭pszResult灝變笉浼氫負NULL銆?/font>
涓夈傝В鍐蟲柟娉?/font>
瑕佽В鍐寵繖涓棶棰橈紝涔熺畝鍗曪紝淇敼涓涓嬪垽鏂璕eadString鎴愬姛涓庡惁鐨勮鍙ワ細
while (dFile.ReadString(str) != FALSE || str.GetLength() != 0)
鍦ㄨ繑鍥濬ALSE鐨勬儏鍐典笅錛孋String鐨勯暱搴︿笉涓?錛屽氨涓嶇畻璇誨彇澶辮觸銆傛垨鑰呰繖鏍?
if(!dFile.ReadString(str) && str.GetLength() == 0)
鍦ㄨ繑鍥濬ALSE騫朵笖CString鐨勯暱搴︿負0錛屽垯綆楄鍙栧け璐ワ紝鍚﹀垯灝辨槸璇誨彇鎴愬姛銆?/p>
榪欎釜紼嬪簭錛屾槸鐢╒C6.0鍋氱殑錛屾垜鏈夌湅浜嗙湅VC2005涓殑浠g爜錛屽彂鐜拌繖涓狟ug琚慨澶嶄簡錛屼唬鐮佸涓嬶細
BOOL CStdioFile::ReadString(CString& rString){ASSERT_VALID(this);
rString = _T(""); // empty string without deallocating
const int nMaxSize = 128;LPTSTR lpsz = rString.GetBuffer(nMaxSize);LPTSTR lpszResult;int nLen = 0;
for (;;)
{lpszResult = _fgetts(lpsz, nMaxSize+1, m_pStream);rString.ReleaseBuffer();// handle error/eof case
if (lpszResult == NULL && !feof(m_pStream))
{Afx_clearerr_s(m_pStream);AfxThrowFileException(CFileException::genericException, _doserrno,m_strFileName);}// if string is read completely or EOF
if (lpszResult == NULL ||
(nLen = (int)lstrlen(lpsz)) < nMaxSize ||
lpsz[nLen-1] == '\n')break;
nLen = rString.GetLength();lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen;}// remove '\n' from end of string if present
lpsz = rString.GetBuffer(0);nLen = rString.GetLength();if (nLen != 0 && lpsz[nLen-1] == '\n')
rString.GetBufferSetLength(nLen-1);return nLen != 0; //榪斿洖鍊煎彉浜嗭紒}
鎴戜滑鐪嬪埌錛孷C2005涓紝璇誨彇閮ㄥ垎鐨勪唬鐮佷笌VC6.0涓殑浠g爜瀹屽叏涓鏍楓備笉涓鏍風殑鍦版柟鍙槸榪斿洖鍊肩殑閮ㄥ垎銆俈C2005鐨凴eadString涓紝榪斿洖鍊間負
return nLen != 0;
涔熷氨鏄錛屽彧瑕佽鍑虹殑CString鐨勯暱搴︿笉涓?灝變負璇誨彇鎴愬姛銆備笌鎴戜慨鏀瑰悗鐨勬柟娉曞畬鍏ㄤ竴鑷淬傚氨榪欐牱鍚戝鎴瘋В閲婏紝鐒跺悗淇敼浜嗐傛?zhèn)插墽鐨勬槸锛屽嚑骞村墠鎵鏈夌▼搴忎腑鎵鏈変嬌鐢≧eadString鍑芥暟鐨勫湴鏂癸紝閮借榪涜淇敼銆傘傘?/p>
MFC鐨勮繖涓狟ug姣旇緝闅愯斀錛屽鉤甯鎬笉瀹規(guī)槗鍙戠幇錛屼絾涓鏃﹂亣鍒扮壒孌婇暱搴︾殑鏁版嵁錛屽氨浼氳〃鐜板紓甯搞傛墍浠ワ紝鍦ㄧ敤VC6.0寮鍙戠殑鏃跺欙紝灝介噺閬垮厤浣跨敤ReadString錛屾垨鑰呭湪浣跨敤涓紝澶氬垽鏂竴姝ヨ鍙栧嚭鏉ョ殑CString闀垮害銆傞伩寮榪欎釜Bug銆?/p>
1960騫存櫤鍒╂搗鍩熷彂鐢熶簡9.5綰э紙澶亹鎬栦簡銆傘傘傦級鍦伴渿銆傚紩璧蜂簡嫻峰暩錛屼竴鐩寸┛榪囨暣涓お騫蟲磱錛屼粠鍗楃編錛屼竴鐩村埌涓滀簹銆傛棩鏈紝澶忓▉澶鳳紝鑿插緥瀹鵑兘鏈?00澶氫漢姝諱骸銆傛墍浠ワ紝榪欐8.8綰у湴闇囷紝濡傛灉鍐嶆潵涓嬈℃搗鍟革紝閭e彲涓嶅緱浜嗗晩銆傝繖嬈℃櫤鍒╃垎鍙戠殑鍦伴渿錛屽紩鍙戜簡鍓х儓鐨勬搗鍟搞傚浠婏紝嫻峰暩鐨勫法嫻鍦ㄦí榪囧お騫蟲磱錛岀洿濂旀棩鏈搗宀歌屾潵銆備及璁″埌杈炬棩鏈椂錛屾氮楂樹緷鐒跺彲浠ヨ揪鍒?0-20鑻卞昂銆?/p>
鏃ユ湰鍏ㄥ浗閮藉湪绱фュ姩鍛橀槻鑼冩搗鍟革紝鐢?shù)瑙嗗彴鍦ㄧ數(shù)瑙嗗睆骞曚竴瑙掑疄鏃跺睍紺轟竴騫呮棩鏈湴鍥撅紝鎵鏈変笓瀹墮嫻嬩細閬埌嫻峰暩琚嚮鐨勫湴鍖洪兘琚爣璁板嚭鏉ワ紝濡備粖錛屼粠鍖楁搗閬?鍒板啿緇籌紝鏁翠釜鏃ユ湰涓滄搗宀稿嚑涔庨兘鍙樻垚浜嗕竴鐗囩孩鑹層傚睆騫曚笂鏂瑰垯鍦ㄦ粴鍔ㄦ挱鍑烘部嫻峰悇鍦板彂甯冪殑閬塊毦閫氱煡錛屼緥濡傦紝闈掓.鍘垮凡緇忔湁涓涓囦節(jié)鍗冨鎴瘋瑕佹眰紱誨榪涘叆鍏敤閬塊毦璁?鏂姐傛棩鏈叏鍥藉埌鐜板湪涓烘宸叉湁40涓囦漢紱誨紑瀹跺洯銆傛暣涓祦紼嬮『鐣咃紝浜曠劧鏈夊簭銆傝繖涓鍒囷紝涓鏂歸潰鍙嶆槧浜嗘棩鏈湪鑷劧鐏懼闈㈠墠鍑鴻壊鐨勫噯澶囧伐浣滐紝鍙︿竴鏂歸潰涔熷弽鏄犱簡鏃ユ湰姘?闂寸殑鎭愭儳銆?/p>
騫挎挱鍛樺湪涓嶆柇鍦ㄦ挱鎶ュ悇鍦版搗騫抽潰鐨勫楂樻儏鍐碉紝闀滃ご涓嶆椂鍒囨崲鍒版部宀稿悇鍦幫紝鎶ラ亾褰撳湴鐘跺喌鍜屾姠闄╁噯澶囩殑鎯呭喌錛屽緢澶氭部嫻峰叕璺涓滃悕楂橀熷叕璺凡緇忓叧闂紝嫻鋒花鍏洯鍋滄钀ヤ笟錛岃埞鑸剁悍綰瘋繘鍏ラ伩闅捐礬綰褲傜粡甯告湁鐢誨闊蟲彃鏂挱闊沖憳鐨勬挱鎶ワ紝绱фラ氭姤鏌愬湴嫻峰鉤闈㈠嚭鐜板紓甯稿楂樸傝漿鐪奸棿灝辨湁浜嗕竴縐嶉櫡鍏ユ煇鍦烘垬浜夌殑鎰熻銆?/p>
鍙戜釜鍥撅紝鐪嬬殑姣旇緝娓呮銆傛暣涓棩鏈潬澶鉤媧嬬殑涓杈癸紝鍏ㄩ儴鏄搗鍟歌鎶ャ?/p>
鍏徃鍋氱殑欏圭洰錛屾濂芥槸緇欏悇涓數(shù)瑙嗗彴鍋氱殑澶╂皵棰勬姤欏圭洰錛屽湴闇囧彴椋庢搗鍟哥殑棰勬姤錛屼篃鍖呭惈鍦ㄥ唴銆傚叧閿椂鍒伙紝鏃ユ湰鐢?shù)瑙嗗彴鎵撶數(shù)璇濊_紝棰勬姤鍥炬樉紺虹殑鏈夎錛屽彧鑳界湅鍒板ぇ闃殑嫻珮錛屽叾浠栧湴鏂規(guī)病鏈夋氮楂樸傚鑷村彧鑳芥樉紺洪儴鍒嗙殑璀︽姤鍥俱備笢浜數(shù)瑙嗗彴涔熸墦鐢?shù)璇濊鐢?shù)瑙嗕笂婊氬姩鏄劇ず鐨勮鎶ユ枃瀛楋紝鐢ㄦ垜浠殑紼嬪簭澶勭悊涓嶄簡錛屾樉紺哄嚭涓嶆潵銆傞┈涓婁貢濂椾簡錛屽綋澶╁叕鍙稿嚑涓漢閮介氬鍦ㄥ鐞嗐傛渶鍚庡己鍒舵樉紺哄叏鍥界殑璀︽姤鍥俱?/p>
鏈鍚庡彂鐜幫紝鏃ユ湰鐢?shù)瑙嗗彴棰勬姤鍥炬槃·烘湁璇Q屽叾瀹炴槸姝g‘鐨勶紝鏈潵鍏朵粬鍦版柟灝辨病鏈夋氮楂樸備負浠涔堝憿錛熷洜涓烘牴鏈氨娌¢偅涔堝ぇ鐨勬氮錛?/p>
鏃ユ湰姘旇薄鍘呭湪3鏈?鏃?0鐐?5鍒嗗叏闈㈣В闄ゅお騫蟲磱娌垮哺嫻峰暩璀︽姤銆?
姘旇薄鍘呰礋璐e湴闇囨搗鍟告嫻嬬殑璇鵑暱鍦ㄨ鑰呬細瑙佷腑璋㈢姜縐幫紝“瀵逛簬嫻峰暩棰勬祴澶уぇ瓚呰繃浜嗗疄闄呮儏鍐碉紝浠ュ強璀︽姤鏃墮棿榪囬暱琛ㄧず姝夋剰銆?#8221;
涓轟粈涔堣繖嬈$殑鍦伴渿錛屾病鏈夊紩璧峰緢澶х殑嫻峰暩鍛紵
鏅哄埄姝ゆ鍦伴渿鎵寮曞彂鐨勬搗鍟鎬篃鍏鋒湁寰堝己鐨勬柟鍚戞э紝鑻卞浗濞佸皵澹ぇ瀛︽柊娓闄紙University of Wales, Newport錛夌殑Simon Haslett 璇?#8220;榪欏洖鐨勬搗鍟擱潪甯告湁鏂瑰悜鎬э紝鑰屼笉鏄偅縐嶅潎鍖鍚戝洓鍛ㄤ紶鎾殑‘寰姹犲閲屾墧鐭沖ご’浼肩殑娉㈡氮”銆備粬琛ㄧず紱婚渿涓渶榪戠殑嫻峰哺錛屼互鍙婅儭瀹夎垂灝斿崡寰鋒柉緹ゅ矝錛圝uan Fernandez Islands錛夋搗鍟擱潪甯稿己錛屼絾鏄叾浠栨柟鍚戠殑嫻峰暩鑳介噺鍜岄珮搴﹁繀閫熷噺閫銆?
鑰屼笖錛屽湴闇囬渿婧愮殑鐩稿娣卞害鈥?5鍏噷鈥斿彲鑳戒篃鍑忓皬浜嗘搗搴婄殑涓婂崌錛岃屾鏄搗搴婄殑涓婂崌鎺掓尋浜嗘搗姘淬傝嫳鍥戒雞鏁﹀ぇ瀛﹀闄ill McGuire琛ㄧず“鐩告瘮姣?004騫寸殑鍗板害媧嬪湴闇囷紝鏅哄埄鍦伴渿瑕佹洿娣憋紝閲婃斁鍒板湴琛ㄧ殑鑳介噺涔熸洿灝?#8221;銆?
铏氭儕涓鍦哄晩銆?
鑷充簬涓滀含鐢?shù)瑙嗗彴鐨勯鎶ユ枃瀛楀鐞嗕笉鍑烘潵锛尵l忚繃鎴戜竴姝ユDebug錛屾渶鍚庡彂鐜幫紝鏄疢FC鐨勪竴涓狟ug閫犳垚鐨勶紒姘旀鎴戜簡銆傚鑷存墍鏈変唬鐮佹秹鍙婅繖涓狟ug鐨勫湴鏂歸兘瑕佷慨鏀廣備笅綃囨棩蹇楋紝璇︾粏璇磋榪欎釜Bug銆?/p>