2013-04-08 4 views
0

수많은 데이터 세트가 들어있는 큰 파일이 있는데 "-"표시가되어있어 데이터가 기록되지 않은 이유가 무엇인지에 대해 공백이 있습니다. 나머지 데이터는 벡터로 두 번 저장됩니다. 문제는 누락 된 데이터를 선택하여 누락 된 데이터를 0으로 저장하는 방법입니다. 내 데이터 파일 스 니펫;텍스트 파일에서 누락 된 데이터를 허용하는 방법

0 29.1  --- 
0 65.9  --- 
2 56.5  --- 
6 19.7 44.3 
9 69.8 64.9 
11 118.6 64.8 
7 35.7 64.1 




if (myfile.is_open()) 
    { 
    int count = 0; 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     /*if (line == "---") 
     { 
     sun(0.0); 
     }*/ 
     if (count > 6) 
     { 

     std::istringstream buffer(line); 
      int month; 
      double rain, sun; 
      if (buffer >> month >> rain >> sun) 
      { 
       Weather objName = {month, rain, sun}; 
       data_weather.push_back(objName);  
      } 
     } 
     count++; 
    } 
    myfile.close(); 

답변

2

한 번에 한 줄 씩 데이터를 문자열로 읽습니다. 그것이 "-"인지 확인하십시오. 만약 그렇다면 동일한 0.0, 그렇지 않다면 double로 변환하고 double을 저장하십시오.

string line; 
while (getline(file, line)) 
{ 
    if (line == "--") 
    { 
     save(0.0); 
    } 
    else 
    { 
     istringstrleam buf(line); 
     double value; 
     if (buf >> value) 
     { 
      save(value); 
     } 
     else 
     { 
      error("could not convert value"); 
     } 
    } 
} 

문자열 변환을 위해 istringstream을 사용하고 있습니다.

(하지만 검증되지 않은 코드입니다)를 작동해야 다음 해당 파일 형식에 대한 새로운 정보를 바탕으로 UPDATE

.

string line; 
while (getline(file, line)) 
{ 
    if (count > 6) 
    { 
     int month; 
     double rain, sun; 
     std::string sun_as_string; 
     std::istringstream buffer(line); 
     if (buffer >> month >> rain >> sun_as_string) 
     { 
      if (sun_as_string == "--") 
      { 
       sun = 0.0; 
      } 
      else 
      { 
       std::istringstream buffer2(sun_as_string); 
       if (!(buffer2 >> sun)) 
       { 
        // couldn't convert the sun value, so just set to zero 
        sun = 0.0; 
       } 
      } 
      Weather objName = {month, rain, sun}; 
      data_weather.push_back(objName);  
     } 

    } 
    ++count; 
} 

태양 광의 값을 문자열로 읽은 다음 "-"가 아닌 경우에만 이중으로 변환하십시오.

+0

여기에 내가 말할 수있는 코드 섹션이 있습니까? 이 일을 돕기 위해 – jaylad

+0

@jaylad 위를 참조하십시오. – john

+0

어디에서 어떻게 저장합니까? – jaylad

1

줄을 --으로 명시 적으로 검사하지 않는 약간 다른 대안을 제공 하겠지만 유효하지 않은 것으로 간주됩니다. float.

std::getline으로 한 번에 하나씩 각 줄을 읽을 수 있습니다.이 줄은 파일 끝에 도달하면 중지됩니다. 각 줄에서 0으로 초기화 한 float (또는 double)으로 추출 할 수 있습니다. 추출에 실패하면 값은 여전히 ​​0이됩니다.

std::string line; 
while (std::getline(file, line)) { 
    std::istringstream ss(line); 
    float f = 0.0f; 
    ss >> f; 
    results.push_back(f); 
} 
+0

누락 된 부분에 OP에''- "'이 있기 때문에 작동 할 것이다. 그러나 사용자가 범위를 벗어난 값을 구문 분석하려고 시도 할 수있는 경우 사용할 수 없습니다 (이 대답의 코드 스 니펫에서 'f')가 변경됩니다. –

+0

@JoachimPileborg 실제로 이것은 간단한 해결책 일뿐입니다. 질문에 주어진 특정 문제는 변화에 강하기위한 것이 아닙니다! –

관련 문제