2012-02-25 4 views
0

이것은 내 문제입니다. txt에서 일부 줄을 읽었습니다. 이 txt는 다음과 같습니다.문자열도 ifstream에서 가져옵니다. " n"

Ciao: 2000 
Kulo: 5000 
Aereo: 7000 

ecc. 나는 모든 단어를 문자열 (':') 앞에 할당하고 그 다음에 맵에 할당해야한다. 숫자를 int로 매핑 한 다음지도로 전달합니다. 문제는 두 번째 줄부터 시작하여 내 문자열이 ("\ n Kulo") ecc가됩니다. 나는 이것을 원하지 않는다! 내가 무엇을 할 수 있을지? 내가 상상할 수 있지만, 당신은 또한 key.substr(0, key.length() - 1)을 사용할 수 있습니다, 대신 임시 문자열에서-반복자의 (

for (std::string line; std::getline(file, line);) 
{ 
    std::string key; 
    int n; 
    std::istringstream iss(line); 

    if (!(iss >> key >> n) || key.back() != ':') { /* format error */ } 

    m.insert(std::make_pair(std::string(key.cbegin(), std::prev(key.cend()), 
          n)); 
} 

:

 #include <iostream> 
     #include <fstream> 
     #include <string> 
     #include <map> 
     using namespace std; 

     int main() 
     { 
      map <string, int> record; 
      string nome, input; 
      int valore; 
      ifstream file("punteggi.txt"); 

      while (file.good()) { 
       getline(file, nome, ':'); 
     //  nome.erase(0,2); //Elimina lo spazio iniziale 
       file >> valore; 
       record[nome] = valore; 
       cout << nome; 
      } 
      file.close(); 

      cout << "\nNome: "; 
      cin >> input; 
      cout << input << ": " << record[input] << "\n"; 

      cout << "\n\n"; 
      return 0; 
     } 
+0

관련 없음,하지만''\ n "'대신'std :: endl'을 사용하십시오. –

+0

'std :: string :: substr'을 사용하여 첫 번째 문자를 건너 뛸 수 있습니다. –

+0

@ J.N. -'std :: endl'과'\ n' -'std :: endl'을 사용하면 버퍼가 플러시됩니다. – birryree

답변

2

문제는입니다.은 형식화되지 않은 입력 함수이므로 선행 공백을 건너 뛰지 않습니다. 그것의 모습에서, 당신은 최고의 공백을 건너 뛰려면 :

while (std::getline(in >> std::ws, nome, ':') >> valore) { 
    ... 
} 

또는 선행 공백이있는 경우, 당신이 할 수 ignore() 모든 문자 줄의 끝에까지의 값을 읽은 후. 여기 std::endl의 사용을 추천을 통해 사람을 본 이후

BTW, 당신이 정말로 버퍼를 플래시하지 않을 경우 하지 사용 std::endl을한다. 파일을 작성할 때 자주 발생하는 성능 문제입니다.

1

표준 라인 읽기 관용구를 사용

코드입니다 내 버전이 좀 더 효율적일 수도 있습니다. 또는 데이터를지도에 삽입하기 전에 key.pop_back();을 추가하십시오.)

+0

내가 틀렸다면 나를 수정하십시오. 왜'm.insert (std :: make_pair (key, n))'가 아닌가? 'if' 조건문에서 추출하지 않았습니까? – Mahesh

+0

@Mahesh : 나는 콜론을 제거하고 싶을지도 모른다고 생각했습니다! 또한 별도의 명령문에서'key.pop_back()'이라고 말할 수 있습니다. 조건부에서는 마지막 문자가 실제로 콜론인지 확인했습니다. –

관련 문제