2009-10-06 2 views
1

혼합 문자로 된 데이터 파일을 효율적으로 읽고 읽는 방법은 무엇입니까? 예를 들어 다른 파일, 32 비트 정수, 문자 및 문자열에서로드 된 데이터가 혼합 된 데이터 파일이 있습니다. 현재 fstream 객체를 사용하고 있지만 int32 나 문자열 끝에 도달하면 중지됩니다. 데이터 파일의 문자열 끝 부분에 무작위 데이터를 추가하면 파일의 나머지 부분을 따라 간다. 이로 인해 문자열에 null-termination이 추가되었다는 것을 믿을 수 있습니다. 다음은 파일의로드의 예C++에서 데이터 파일을 읽고 구문 분석하는 적절한 방법은 무엇입니까?

void main() 
{ 
    fstream fin("C://mark.dat", ios::in|ios::binary|ios::ate); 
    char *mymemory = 0; 
    int size; 
    size = 0; 
    if (fin.is_open()) 
    { 
     size = static_cast<int>(fin.tellg()); 
     mymemory = new char[static_cast<int>(size+1)]; 
     memset(mymemory, 0, static_cast<int>(size + 1)); 

     fin.seekg(0, ios::beg); 
     fin.read(mymemory, size); 
     fin.close(); 
     printf(mymemory); 
    std::string hithere; 
    hithere = cin.get(); 
    } 
} 

왜 수의 정수 또는 문자열에서 읽은 후이 코드 정지? 어떻게이 문제를 해결할 수 있을까요? 이러한 유형의 파일을 다룰 때 잘못된 접근 방식입니까? fstream을 전혀 사용하지 않아야합니까?

답변

3

파일 읽기가 완벽하게 작동하고 있으며 첫 번째 null에서 멈추는 printf (mymemory)라고 생각한 적이 있습니까?

디버거를 살펴보고 내가 맞는지 확인하십시오.

다른 사람의 버퍼를 인쇄하려면 puts (mymemory) 또는 printf ("% s", mymemory)를 사용하십시오. 형식 문자열에 대해 다른 사람의 입력을 받아들이지 않으면 프로그램이 중단 될 수 있습니다.

는 진수로 다시 밖으로 데이터 파일을 덤프하는 방법으로

for (int i = 0; i < size ; ++i) 
{ 
    // 0 - pad with 0s 
    // 2 - to two zeros max 
    // X - a Hex value with capital A-F (0A, 1B, etc) 
    printf("%02X ", (int)mymemory[i]); 
    if (i % 32 == 0) 
    printf("\n"); //New line every 32 bytes 
} 

을보십시오.

+0

멋진 콘텐츠. 나는 cout << mymemory [i]를했고 나는 데이터를보고있다. ... ish. 그걸 확인해 줘서 고마워. 만약 내가 파일의 처음 4 문자가 "마크"와 나는 파일의 나머지 부분을 읽기 전에 그것을 확인하고 싶다는 걸 알았어, C에서 쉬운 구문 분석 방법은 + +이 어색한 데이터를 다루는가? – Mark

+0

사실 그것은 다른 질문 일 것입니다. 지금 받아 들여라. – Mark

+0

@ 마크 : 물론. 분명히, 만약 당신의 '매직 넘버'가''mark ''이외의 것이라면 분명히 숫자 항목이있는 문자 배열로 변경해야 할 것입니다 (if strncmp ("mark", memory, 4) 쉽게 입력 할 수있는 문자에는 해당하지 않습니다. – Novelocrat

관련 문제