我正在使用一些遗留代码。在以下场景中,遗留代码在生产模式下工作。我正在尝试构建遗留代码的命令行版本以进行测试。我怀疑这里存在环境设置问题,但我对 C++ 和 Visual Studio 比较陌生(长期使用 eclipse/java 的人)。
此代码正在尝试从流中读取字符串。它读起来很短,在我的调试场景中它的值为 11。然后,它应该读入 11 个字符。但是这段代码在第一个字符上就出错了。具体来说,在下面的read
方法中,ptr
为 null,因此fread
调用会引发异常。为什么是ptr
NULL?
澄清点,ptr
在 operator>>(string) 和 operator>>(char) 调用之间变为 null。
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;
}
读取short的方法是here并查看文件缓冲区等。这看起来工作正常。
Mystream& Mystream::operator>>(short& n )
{
read( ( char* )&n, sizeof( n ) );
SwapBytes( *this, ( char* )&n, sizeof( n ) );
return *this;
}
现在,读取字符的方法在这里:
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;
}
有一件事我不明白,在字符串输入法中,*它是一个字符对吗?那么为什么 operator>>(char &n) 方法会在那一行被调度呢?在调试器中,它看起来像 *it 是一个 0,(尽管一位同事告诉我他不信任 2005 调试器在这些事情上),因此,看起来 &n 被视为空指针,因此读取方法抛出异常。
您可以提供的任何见解都将是最有帮助的!
谢谢约翰
附言。出于好奇,Swap
Bytes 看起来像这样:
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;
}
}