锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓婃璇存棩鏈搗鍟歌鎶ョ殑鏃跺欙紝紼嬪簭鍑洪敊銆傚湪瑙f瀽浠g爜鐨勬椂鍊欙紝鍙戠幇浜哅FC涓殑涓涓狟ug銆?/p>
涓銆傞棶棰樼殑浜х敓銆?/p>
榪欎釜紼嬪簭錛岀敤鏉ュ鐞嗘棩鏈悇縐嶅ぉ姘旈鎶ユ暟鎹紝鍖呮嫭鐏懼鐨勯鎶ャ傚鏋滃湴闇囷紝鍙伴涔嬬被鐨勮嚜鐒剁伨瀹沖埌鏉ワ紝紼嬪簭浼氭妸棰勬姤鏁版嵁榪涜澶勭悊錛岀敓鎴愮浉搴旂殑璀︽姤淇℃伅錛屽茍鍦ㄧ數瑙嗕笂闈㈡樉紺烘粴鍔ㄧ殑瀛楀箷鏉ユ彁紺恒傜▼搴忔湰韜紝鏄嚑騫村墠鍏徃鐨勫叾浠栦漢鍐欑殑銆傞噷闈㈡湁娑夊強鍒版枃浠惰鍐欑殑鍦版柟錛屾湁寰堝鍦版柟錛岀敤浜哅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鐨勯暱搴︿笉涓?灝變負璇誨彇鎴愬姛銆備笌鎴戜慨鏀瑰悗鐨勬柟娉曞畬鍏ㄤ竴鑷淬傚氨榪欐牱鍚戝鎴瘋В閲婏紝鐒跺悗淇敼浜嗐傛偛鍓х殑鏄紝鍑犲勾鍓嶆墍鏈夌▼搴忎腑鎵鏈変嬌鐢≧eadString鍑芥暟鐨勫湴鏂癸紝閮借榪涜淇敼銆傘傘?/p>
MFC鐨勮繖涓狟ug姣旇緝闅愯斀錛屽鉤甯鎬笉瀹規槗鍙戠幇錛屼絾涓鏃﹂亣鍒扮壒孌婇暱搴︾殑鏁版嵁錛屽氨浼氳〃鐜板紓甯搞傛墍浠ワ紝鍦ㄧ敤VC6.0寮鍙戠殑鏃跺欙紝灝介噺閬垮厤浣跨敤ReadString錛屾垨鑰呭湪浣跨敤涓紝澶氬垽鏂竴姝ヨ鍙栧嚭鏉ョ殑CString闀垮害銆傞伩寮榪欎釜Bug銆?/p>