2013-02-12 2 views
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; 
} 

여기 내 시스템이다 :: 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; 
       } 
     }; 
    } 
} 

이 일어나고 끝나는 것입니다 : What happens

왜이 사람이 설명 할 수 있습니까? appens, 어떻게 고칠 수 있습니까? 나는 C++을 처음 사용하기 때문에 설명이 도움이 될 것입니다. 또한 내 스크립팅을 비판하지 마세요, 나쁘고, 구식이 될지도 모르는 등 알고 있습니다.하지만 배우는 것에 익숙하며 도움을주는 조언이 더 좋습니다. :)

+6

Null 터미네이터가 누락 되었습니까? 'magic [7] = '\ 0';'. –

+0

@JesseGood 해보겠습니다. – MysteryDev

+0

@JesseGood 와우 내가 '= 0 /'하고 있었다 !! 고마워요.하지만 처음부터 왜해야만하는지 설명 할 수 있습니까? 나는 어딘가에 창문이 당신이 말한 공간이나 그 주변의 공간을 항상 할당하지는 않는다는 것을 읽었다. – MysteryDev

답변

0

임의의 문자 배열이 아닌 C 스타일 문자열에만 operator << (char *)을 사용할 수 있습니다. 얼마나 많은 문자를 출력해야하는지 어떻게 알 수 있습니까?

내가 파일을 추측 할
+0

@DavidSchwarts 의견이 있습니다 –

+0

어쨌든 콘솔에서 C 문자열 만 출력 하겠지만 알 수는 없습니다. char * data = new char [8]; 8 바이트 길이의 문자 배열이 될 것이라고 말하지 않습니까? 또한 서명되지 않은 char을 사용해야합니까? 아니면 중요합니까? – MysteryDev

+0

@ user1425433'C'로 시작하기 때문에 C# 지식을 재사용 할 수 있다고 가정하는 대신 자신에게 호의를 베풀고 C++에 대한 책 *을 읽으십시오. C# 배열이 C++ 배열과 공통점이있는 유일한 것은 대괄호입니다. – us2012

0

가 제대로 개설되지 않았으며, 따라서 마법 버퍼가 초기화 된 정크 데이터와 단풍하는 전혀 설정되지 않은 : 생성자가 파일을 여는 성공하지 못하면

, 객체 스트림 버퍼 에 파일이 연결되어 있지 않고 스트림의 failbit이 설정되어 있습니다.이 파일은 상속 된 구성원이 실패하면 확인할 수 있습니다. http://www.cplusplus.com/reference/fstream/ifstream/ifstream/

시도 특히 열어 버퍼를 판독 할 때, (COUT 사용) 도중에 오류 검사 더 추가. 아마도 마법 버퍼를 0으로 설정하거나 성공할 때 덮어 쓸 수있는 인식 가능한 값으로 설정하십시오.

관련 문제