2014-03-30 3 views
0

내가 다음 줄을 사용하여 파일에 구조를 쓰고에서 바이너리 데이터를 읽어이진 파일

typedef struct _rawData rawDataStruct; 

지금에 구조를 작성 후 파일을 사용하여 이진 파일의 시작 부분에서 구조를 읽는 중입니다.

std::cout << "going for print data read from file\n"; 
snif::fileHandler.seekg(0); //, std::ios::beg); 
snif::fileHandler.read(reinterpret_cast<char*>(rawData), sizeof(rawDataStruct)); 

if (snif::fileHandler.fail()) { 
    std::cerr << "reading error\n"; 
    exit(0); 
} 

std::cout << "PSH flag = " << rawData->tcpFlag.PSH << std::endl 
      << "source port " << rawData->sourcePort << std::endl 
      << "destination port " << rawData->destinationPort << std::endl 
      << " sequence number " << rawData->sequenceNumber << std::endl 
      << " Acknowledge number " << rawData->acknowledgeNumber << std::endl 
      << " acknowledge flag " << rawData->tcpFlag.ACK << std::endl 
      << " SYN flag  " << rawData->tcpFlag.SYN << std::endl 
      << "FIN flag  " << rawData->tcpFlag.FIN << std::endl; 

하지만 난 내 표준 출력을 선택하면 마지막 줄이 인쇄에 geting입니다

"going for print data read from file"; 
+0

읽기 전에 'snif :: fileHandler'가 (예 :'.fail()'을 사용하여) 읽는 것이 좋은지 확인 했습니까? open이 실패하면 프로그램이 stdin (파일 설명자 0)에서 읽으려고합니다. – Thomas

답변

0

가 그것을 보여주는 어떤 코드는 없지만, 어떤 모드는 파일이 열립니다? 잘하면 그것은 binary에 대해 구성됩니다. 사용 가능한 옵션을 보려면 std::basic_fstreamstd::ios_base::openmode을 검토하십시오. 나는 다음과 같은 개방 모드가 설정되어 있는지 확인하는 것이 좋습니다 :

ios::binary | ios::out | ios::in | ios::trunc 

는 무슨 일이 일어나고 있는지 목적에 따라 ios::trunc (잘라 내기)는 ios::app (추가)로 대체해야 할 수 있습니다. 몇 가지 기본적인 테스트를하는 동안

, 그것은 내 C++

fileHandler.write(reinterpret_cast<char*>(rawData), sizeof(rawDataStruct)); 


쉽게 RAWDATA 앞에 & 연산자를 추가하여 해결 잠재적 인 문제가 11 준수 컴파일러에서 발견 된 이 같은 :

fileHandler.write(reinterpret_cast<char*>(&rawData), sizeof(rawDataStruct)); 


컴파일러가 경고를 제공하지만이 -Wall 옵션 또는 더 나은 사용 여부를 컴파일러 버전에 파견하고,해야합니다. 화면 출력이 겉보기에 화면에서 멈추는 것을 설명 할 수 있습니다.

"going for print data read from file" 

메시지 판독 기능은 RAWDATA 앞에 & 연산자 필요 :

snif::fileHandler.read(reinterpret_cast<char*>(&rawData), sizeof(rawDataStruct)); 

아마도 reinterpret_cast<> 오퍼레이터로부터 런타임 예외가 잡힌되지 않고 발생되고있다. 시스템과 컴파일러가 문서화 될 때까지는 알기가 어렵습니다.

또한 rawData이 포인터로 선언 된 경우 더 좋은 변수 이름은 pRawData이며 더 많은 코드를 게시합니다. 예를 들어, pRawDatarawDataStruct의 유효한 인스턴스를 절대로 가리 키지 않으면 예측할 수없는 일이 발생합니다.

+0

fileHandler.close();를 수행하면 파일에 데이터를 쓰고 난 후 open을 잊어 버립니다. 그 행 다음에 std :: out으로 아무 것도 출력되지 않습니다. – Sigstop

+0

@Startup 데이터를 쓰려면 파일을 열어야합니다. – 0x499602D2

+0

@ 0x499602D2 죄송합니다. 필자는 파일을 열어서 코드를 듣지 않습니다. 파일의 크기를 확인하면 쓰기 때문에 증가하고 있습니다. – Sigstop