2014-03-30 4 views
0

저는 C++을 매우 신형 적이기 때문에, 이것이 바보 같은 질문이라면 유감스럽게 생각합니다!파일의 행에서 데이터를 가져 오려고 시도합니다.

프로젝트의 경우 수천 줄의 값이있는 파일이 제공되며 각 줄마다 9 개의 다른 숫자가 있습니다.

각 루프마다 8 번째와 9 번째 줄의 정수를 변수로 저장하여 일부 계산을 수행 할 수있는 for/while 루프를 만들고 싶습니다. 그런 다음 루프는 다음 줄로 이동하고 그 줄의 8 번째와 9 번째 줄을 동일한 변수로 저장하여 동일한 계산을 수행 할 수 있습니다. 줄이 없을 때 끝납니다.

내 문제는 파일을 읽는 것과 관계가 없으며 각 줄에서 8 번째 및 9 번째 값만 가져 오는 방법을 혼란스럽게 생각합니다.

도움을 주셔서 감사합니다.

답변

0

속도가 아닌 가독성을 위해 설계되었습니다. 또한 입력 파일이 올바른 형식인지 확인하지도 않습니다. 이 이후

template<class T> ConvertFromString(const std::string& s) 
{ 
    std::istringstream ss(s); 
    T x; 
    ss >> x; 
    return x; 
} 


std::vector<int> values8; 
std::vector<int> values9; 

std::ifstream file("myfile.txt"); 
std::string line; 
while (std::getline(file, line)) 
{ 
    std::istringstream ss(line); 
    for (int i = 0; i < 9; i++) 
    { 
     std::string token; 
     ss >> token; 
     switch (i) 
     { 
      case 8: 
      { 
       values8.push_back(ConvertFromString<int>(token)); 
      } 
      break; 

      case 9: 
      { 
       values9.push_back(ConvertFromString<int>(token)); 
      } 
      break; 
     } 
    } 

} 
0

먼저 split the string을 입력 한 다음 atoi을 사용하여 숫자로 변환하십시오. 그런 다음 숫자가있는 배열 또는 벡터에서 8 번째 및 9 번째 값을 가져옵니다.

//Split string 
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    split(s, delim, elems); 
    return elems; 
} 

//new code goes here 
std::string line; 

std::vector<std::string> lineSplit = split(line, ' '); 
std::vector<int> numbers; 

for (int i = 0; i < lineSplit.size(); i++) 
    numbers.push_back(atoi(lineSplit[i]);//or stoi 

int numb1 = numbers[7];//8th 
int numb2 = numbers[8];//9th 
+0

당신이 좋아 구축 ++ C를 추천한다 ++ C ['표준 : istringstream'] (http://en.cppreference.com/w/cpp/io/basic_istringstream)와 ['표준 : stoi입니다 '] (http://en.cppreference.com/w/cpp/string/basic_string/stol),이 시나리오에서는 후자를 사용할 필요가 없습니다. – 0x499602D2

+0

@ 0x499602D2 여기서 'istringstream'이 어떻게 적용될 수 있는지 보지 못합니까? –

+0

그는 각 라인을 살펴보고 그 라인에서 정수를 추출해야합니다. 그는 문자열을 문자열에 넣는'std :: getline()'을 사용하여 행을 통과 한 다음 문자열을'std :: istringstream'을 사용하여 스트림으로 만들어 정수로 읽을 수 있습니다. – 0x499602D2

관련 문제