2013-03-19 2 views
2

좋아, 그래서 한 번에 1 장씩 읽으려는 거대한 파일이 있습니다. 챕터는 '$'으로 구분됩니다. 저는 C++에 익숙하지 않습니다. 그래서 저는 C/C++에서 기대했던대로 장에서 읽을만한 것을 만들었습니다.C++은 특정 구분 기호가 될 때까지 텍스트 파일을 읽습니다.

#include <nds.h> 
#include <stdio.h> 
#include <string> 
#include <vector> 
#include <sstream> 

int dataFileLoc = 7; 

std::string fileReader(){ 
    FILE * dataFile; 
    std::string chapterBuffer = ""; 
    const int buffersize = 1024; 
    char charBuffer[buffersize]; 
    bool foundEnd = false; 
    dataFile = fopen("xc3_.tsc", "rt");//open data file 
    fseek(dataFile,dataFileLoc,SEEK_SET); 
    while(!foundEnd){ 
     fread(charBuffer,1,buffersize,dataFile); 
     for(int i=1; i<buffersize; i++){ 
      if(charBuffer[i] == '$'){ 
       foundEnd = true; 
       charBuffer[i] = '\0'; 
       dataFileLoc = ftell(dataFile)-(buffersize-i); 
       break;//break to spare some time 
      } 
     } 
     chapterBuffer.append(charBuffer); 
    } 
    fclose(dataFile);//done with the file for now. 

    checkerTemp(chapterBuffer); 

    return chapterBuffer; 
} 

결과가 좋을 것입니다. 아직 파일 끝에 도달하지 못했습니다. 그래서 거기에서 실패 할 수도 있습니다. 그러나 겉으로보기에는 무작위로 보입니다 (일관성이 있지만 겉으로는 임의의 위치). 이 오류로 인해 문자열에 정크 데이터가 주입되고 (8 문자 상당) 일반 데이터가 다시 표시됩니다.

누구나이 문제를 일으킬 수있는 아이디어가 있습니까? 아니면이 사람에게 적절한 C++ 방법이 있습니까? 문자열 판독기로 뭔가? 당신의 while 루프 경우, 주위

chapterBuffer.append(charBuffer); 
이 종료되지 문자를 추가하려고 할 것입니다 후 문을 루프이다

-Smileynator

+2

['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline)을 확인하십시오. 물론 C++ [입력/출력 기능] (http://en.cppreference.com/w/cpp/io)에 대해 더 자세히 알아야합니다. –

+2

'getline (file, data, '$')'를 사용하여 20 줄의 코드를 하나의 코드로 대체합니다. – john

+0

버퍼의 첫 번째 문자가 스캔되지 않습니다. for (int i = 0; ... '를 사용하십시오. – suspectus

답변

2

하나의 오류 사전에

감사합니다, 버퍼에 챕터 버퍼 - 좋은 일이 아니다. for 루프 내에서 '$'를 찾았는지 여부를 확인해야합니다. 그렇지 않은 경우에는 charBuffer를 종료해야합니다. 또는 charBuffer에 대해 buffersize + 1 바이트를 할당하고 루프 앞에 charBuffer [buffersize] = '\ 0'을 설정할 수 있습니다.

+0

이것은 매우 논리적 인 대답처럼 보입니다. 집에 갈 때 테스트 할 것입니다! 이런 식으로 뭔가를 찾았지만 혼자서 찾지 못했습니다! – Smileynator

3

C 파일 API를 사용 중이라면 C++ iostream API를 사용해야합니다.

장을 읽으려면 std::getline'$'을 구분 기호로 사용해야합니다. 즉, 문자열 객체가 자동으로 할당하므로 버퍼 할당에 대해 걱정할 필요가 없습니다.

루프도 매우 간단 해집니다.

while(std::getline(strm, str, '$').good()) 
    do_something_with_chapter(str); 
+0

'.good()'는 필요 없습니다. – XTF

관련 문제