我正在使用一些遺留代碼。在以下情況下,舊版代碼在生產模式下工作。我正在嘗試構建用於測試目的的舊版代碼的命令行版本。我懷疑這裏有一個環境設置問題,但我對C++和Visual Studio相當陌生(很長一段時間的eclipse/java人)。在Visual Studio 2005中使用string :: iterator的空指針問題
此代碼嘗試從流中讀取字符串。它讀取一個簡短的內容,在我的調試場景中它的值爲11.然後,它應該讀取11個字符。但是這個代碼在第一個字符上出現了。具體而言,在下面的read
方法中,ptr
爲空,因此fread
調用將引發異常。爲什麼ptr
爲NULL?
要澄清一點,ptr
在操作符>>(字符串)和操作符>>(char)之間變爲空值。
Mystream& Mystream::operator>>(string& str)
{
string::iterator it;
short length;
*this >> length;
if(length >= 0)
{
str.resize(length);
for (it = str.begin(); it != str.end(); ++it)
{
*this >> *it;
}
}
return *this;
}
閱讀短的方法是在這裏,看着文件緩衝區等,這看起來像它正常工作。現在
Mystream& Mystream::operator>>(short& n)
{
read((char*)&n, sizeof(n));
SwapBytes(*this, (char*)&n, sizeof(n));
return *this;
}
,在一個char讀取的方法是在這裏:
Mystream& Mystream::operator>>(char& n)
{
read((char*)&n, sizeof(n));
return *this;
}
和讀取方法是:
Mystream& Mystream::read(char* ptr, int n)
{
fread((void*)ptr, (size_t)1, (size_t)n, fp);
return *this;
}
有一件事我不明白,在字符串中輸入法,*它是一個char對嗎?那麼爲什麼操作員>>(char & n)方法在該行被派遣?在調試器中,它看起來像*它是0(儘管一個同事告訴我他不信任2005年的調試器),因此,它看起來像是& n被視爲空指針,所以讀取方法拋出異常。
您可以提供的任何見解將是最有幫助的!
感謝 約翰
PS。對於好奇,Swap
字節看起來是這樣的:
inline void SwapBytes(Mystream& bfs, char * ptr, int nbyte, int nelem = 1)
{
// do we need to swap bytes?
if(bfs.byteOrder() != SYSBYTEORDER)
DoSwapBytesReally(bfs, ptr, nbyte, nelem);
}
而且DoSwapBytesReally
樣子:
void DoSwapBytesReally(Mystream& bfs, char * ptr, int nbyte, int nelem)
{
// if the byte order of the file
// does not match the system byte order
// then the bytes should be swapped
int i, n;
char temp;
#ifndef _DOSPOINTERS_
char *ptr1, *ptr2;
#else _DOSPOINTERS_
char huge *ptr1, huge *ptr2;
#endif _DOSPOINTERS_
int nbyte2;
nbyte2 = nbyte/2;
for (n = 0; n < nelem; n++)
{
ptr1 = ptr;
ptr2 = ptr1 + nbyte - 1;
for (i = 0; i < nbyte2; i++)
{
temp = *ptr1;
*ptr1++ = *ptr2;
*ptr2-- = temp;
}
ptr += nbyte;
}
}
哪裏讀取short的方法? – ForEveR 2012-08-03 15:34:34
更新後的描述。 – John 2012-08-03 15:56:54
你似乎相信'char&n'的語法與指針有某種關係。事實並非如此。它聲明瞭一個參考。它被綁定到'char'對象'* it',因爲它應該。閱讀您最喜愛的C++書籍中的參考資料。 – AnT 2012-08-03 16:00:29