私はいくつかのレガシーコードを使用しています。次のシナリオでは、レガシーコードは本番モードで機能します。テスト目的で、レガシーコードのコマンドラインバージョンを作成しようとしています。ここでは環境設定の問題があると思いますが、私はC++とVisualStudio(長年の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;
}
ショートを読み取る方法はここにあり、ファイルバッファなどを確認します。これは正常に機能しているように見えます。
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;
}
私が理解していないことの1つは、文字列入力メソッドで、*それは文字ですよね?では、なぜoperator >>(char&n)メソッドがその行にディスパッチされるのでしょうか。デバッガーでは、*それは0のように見えます(同僚はそのようなことで2005デバッガーを信頼していないと言っていますが)、したがって、&nはnullポインターとして扱われるように見えるので、メソッドは例外をスローしています。
あなたが提供できる洞察は最も役に立ちます!
ありがとうジョン
ps。不思議なことに、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;
}
}