2012-02-22 5 views
0

텍스트 파일을 검색하고 제목 다음에 데이터를 추출합니다. 그러나, 나는 극복하는 방법을 모르는 반복자에 관한 몇 가지 이슈를 가지고있다.텍스트 파일에서 데이터 찾기 및 추출

이 샘플 텍스트 파일입니다 LoadData<bool> something.LoadData("Relay States");를 호출하고 0,0,0,0 {가진 표준 : : 벡터를 반환 한 이상적으로

Relay States 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 

가, 내가 좋아하는 것, 0,0,0,0, ...}. 내가 이해에서

template<typename T> std::vector<T> CProfile::LoadData(const std::string& name) 
{ 
    std::ifstream ifs(FILE_NAME); 
    std::vector<T> data; 
    std::istreambuf_iterator<char> iit = std::istreambuf_iterator<char>(ifs); 

    std::search(iit, ifs.eof(), name.begin(), name.end()); 
    std::advance(iit, name.size() + 1); 

    T buffer = 0; 
    for(ifs.seekg(iit); ifs.peek() != '\n' && !ifs.eof(); data.push_back(ifs)) 
    { 
     ifs >> buffer; 
     data.push_back(buffer); 
    } 

    return data; 
} 

, 내 코드의 주요 문제는 다음과 같습니다

  • 표준 : 검색 모호한 호출입니다,이 고정에 대해 어떻게 갈 것인가?
  • ifs.seekg (iit)가 합법적이지 않은 경우 유효한 인수를 만드는 방법은 무엇입니까?

감사합니다.

+0

는 헤더와 데이터는 별도의 줄에 항상 있는가? 표시된 샘플과 같이 별도의 라인에있는 데이터입니까? 데이터의 양이 항상 같은가, 또는 얼마나 많은 양을 추적하고 있습니까? –

+0

데이터가 2D 배열에서 오는 경우 정확히 위와 같습니다. 다운로드 할 수있는 양을 결정하려면 제목 이름과 "\ n \ n"사이를 읽어야합니다. 데이터 다음에는 항상 \ n 두 개가 있습니다. –

답변

1

이 잘 나는 당신의 인수 성병 생각 :: 검색 문제

입니다
std::search(iit, ifs.eof(), name.begin(), name.end()); 

가 라인으로

std::search(iit, std::istreambuf_iterator<char>(), name.begin(), name.end()); 

해야한다 : ifs.seekg(iit)for 루프가 좋지 않아, seekg 일부 상쇄 기대 때문에 유형이 streampos이고 반복자가 아님 그래서해야 ifs.seekg(0)

+0

답장을 보내 주셔서 감사합니다. ipt가 가리키는 char에 오프셋을 어떻게 설정할 수 있는지 알고 있습니까? –

+0

@ user968243'iit'은'istream'의 버퍼에서 내부적으로 바이트를 취하는 istream 버퍼 반복자입니다 (그래서'name'ize() + 1로'iit'을 진행할 때'istream'에서 많은 바이트를 읽습니다) 의 버퍼), 그것은 실제로 어떤 위치를 가지고 있지 않습니다. 당신의 코드를 보면서,'name' size() + 1'에 의해'iit'이 향상되었다고 말할 수 있습니다. (현재'name.size() + 1'에서 바이트로되어 있습니다.) 그래서'ifs.seekg 이름. 크기() +1)'. –

1

어떻게 이런 일에 대해 :

template<typename T> std::vector<T> CProfile::RealLoadData(std::istream &is) 
{ 
    std::string line; 
    std::vector<T> data; 

    while (std::getline(is, line)) 
    { 
     if (line.empty()) 
      break; // Empty line, end of data 

     std::istringstream iss(line); 

     T temp; 
     while (iss >> temp) 
      data.push_back(temp); 
    } 

    return data; 
} 

template<typename T> std::vector<T> CProfile::LoadData(const std::string& name) 
{ 
    std::string line; 
    std::ifstream ifs(FILE_NAME); 

    while (std::getline(ifs, line)) 
    { 
     if (line == name) 
     { 
      // Found the section, now get the actual data 
      return RealLoadData<T>(ifs); 
     } 
    } 

    // Section not found, return an empty vector 
    return std::vector<T>(); 
} 
관련 문제