문제

데이터 구조가 정의되어 있습니다

struct myDataStruct
{
   int32_t header;
   int16_t data[8];
}

그리고 캐릭터 스트림을 가져다가 MyData 스트림으로 바꾸고 싶습니다. 어떤 스트림 클래스를 확장해야합니까? 나는 같은 일을 할 수 있도록 사용자 정의 스트림 클래스를 만들고 싶습니다.

myDataStruct myData;
myDataStruct myDataArray[10];

myDataStream(ifstream("mydatafile.dat"));
myDataStream.get(myData);
myDataStream.read(myDataArray, 10);
도움이 되었습니까?

해결책

대신에 myDataStream.get(myData), 당신이하는 일은 과부하입니다 operator>> 데이터 유형의 경우 :

std::istream& operator>>(std::istream& is, myDataStruct& obj)
{
  // read from is into obj
  return is;
}

배열을 읽고 싶다면 루프를 작성하십시오.

for( std::size_t idx=0; idx<10; ++idx ) 
{
   myDataStruct tmp;
   if( is >> tmp )
     myDataArray[idx] = tmp;
   else
     throw "input stream broken!";
}

함수 템플릿을 사용하면 오른쪽의 어레이에 대해 연산자에 과부하를 걸 수 있어야합니다 (그러나 이것은 시도한 적이 없습니다).

template< std::size_t N >
std::istream& operator>>(std::istream& is, myDataStruct (&myDataArray)[N])
{
  // use loop as above, using N instead of the 10
}

그러나 나는 이것이 화려하거나 비열한지를 결정할 수 없습니다.

다른 팁

형식화되지 않은 입력으로 작업하는 경우 이진 형태로 직접 읽어야 할 것입니다. 일반적으로 일부 컴파일러 특정 지침을 사용하여 패딩이없는 데이터 구조를 작성한 다음 파일에서 읽고 쓰기 만하면됩니다.

// Gcc
#pragma pack(1) // option 1: pragmas
struct frame {
   std::uint32_t header;
   std::uint16_t data[8];
} __attribute((packed)); // option 2: packed attribute
#pragma pack(0)

bool operator==( data const & lhs, data const & rhs )
{
   bool result = lhs.header == rhs.header;
   for ( int i = 0; i < 8; ++i )
   {
      result &= lhs.data[i] == rhs.data[i];
   }
   return result;
}

int main()
{
   frame data = { 10, 1, 2, 3, 4, 5, 6, 7, 8 };

   std::ofstream out( "data.bin", ofstream::binary );
   out.write( reinterpret_cast<char*>(&data), sizeof(data) );
   out.close();

   std::ifstream in( "data.bin", ifstream::binary );
   frame readed;
   in.read( reinterpret_cast<char*>(&readed), sizeof(readed) );
   in.close();

   std::cout << (readed == data) << std::endl; // 1
}

VS에 대한 패딩을 비활성화하기위한 컴파일러 지침은 다를 수 있습니다 (Pragma 지시문은 GCC와 VS 모두에서 작동한다고 생각하지만 항상 속성을 사용했습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top