0

そのクラスからいくつかの System.IO 関数を再作成していました。バッファをセットアップして n 個のバイトを割り当てると、それにバイトが読み込まれ、そのバッファの最後にランダムなバイトが追加されます。

例えば:

私のメイン:

int main(int argc, char *args[])
{
    SetConsoleTitle(TEXT("Stream Test."));
    cout<<"Press any Key to begin reading.";
    cin.get();
    const char* data = File::ReadAllBytes(args[1]);
    Stream* stream = new Stream(data);
    char* magic = new char[8];
    stream->Read(magic, 0, 8);
    magic[8] = '\0';
    cout<<magic<<endl<<endl;
    delete[]data;
    cout<<"Press any key to quit.";
    cin.get();
    return 0;
}

ここに私の System::IO 名前空間 + ストリーム クラスがあります:

namespace System
{
    namespace IO
    {
        class File
        {
        public:
            static char* ReadAllBytes(const char *name)
            {
                ifstream fl(name, ifstream::in|ifstream::binary);
                fl.seekg( 0, ifstream::end );
                size_t len = fl.tellg();
                char* ret = new char[len+1];
                ret[len] = '\0';
                fl.seekg(0); 
                fl.read(ret, len);
                fl.close();
                return ret;
            }

            //not sure of this use yet.
            static size_t fileSize(const char* filename)
            {
                ifstream in(filename, ifstream::in | ifstream::binary);
                in.seekg(0, ifstream::end);
                return in.tellg(); 
            }
        };

        class Stream
        {
        public:
            const char *_buffer;
            __int64 _origin;
            __int64 _position;
            __int64 _length;
            __int64 _capacity;

            bool _expandable;
            bool _writable;
            bool _exposable;
            bool _isOpen;

            static const int MemStreamMaxLength = 2147483647;

            Stream()
            {
                InitializeInstanceFields();
            }

            Stream(const char *buffer)
            {
                _buffer = buffer;
                _length = strlen(_buffer);
                _capacity = _length;
                _position = 0;
                _origin = 0;
                _expandable = false;
                _writable = true;
                _exposable = true;
                _isOpen = true;
            }

            int ReadByte()
            {
                if (_position >= _length)
                    return -1;
                return _buffer[_position++];
            }

            void Read(char* &buffer, int offset, int length)
            {
                if((_position + offset + length) <= _length)
                {
                    memcpy( buffer, _buffer + (_position + offset), length );
                    _position += length;
                }
            }

            private:
                void InitializeInstanceFields()
                {
                    _origin = 0;
                    _position = 0;
                    _length = 0;
                    _capacity = 0;
                    _expandable = false;
                    _writable = false;
                    _exposable = false;
                    _isOpen = false;
                }
        };
    }
}

これが最終的に起こることです: 何が起こるのですか

なぜこれが起こるのか、どうすれば修正できるのか、または何か他のことを誰かが説明できますか? 私はC++が初めてなので、説明があれば助かります。また、私のスクリプトを批判しないでください。悪い、時代遅れ、非推奨などの可能性があることは承知していますが、私は学習に対してオープンであり、役立つアドバイスはより良いものになります。:)

4

2 に答える 2

0

operator << (char *)任意の文字配列ではなく、C スタイルの文字列でのみ使用できます。出力する文字数をどのように知ることができますか?

于 2013-02-12T03:51:17.147 に答える
0

ファイルが正しく開かれていないため、マジック バッファがまったく設定されておらず、初期化されたジャンク データが残っていると思います。

コンストラクターがファイルを開くことに成功しなかった場合でも、オブジェクトは作成されますが、ストリーム バッファーに関連付けられているファイルはなく、ストリームの failbit が設定されます (継承されたメンバーの fail で確認できます)。 http://www.cplusplus.com/reference/fstream/ifstream/ifstream/

特にバッファーを開いて読み取るときに、(cout を使用して) 途中でさらにエラー チェックを追加してみてください。おそらく、マジック バッファをゼロに設定するか、成功したときに上書きされる認識可能なものに設定します。

于 2013-02-12T04:01:49.497 に答える