2014-12-13 6 views
0

공백을 제거하고 공백 뒤에 문자를 저장하려고합니다. 이것은 ws 기능은 스트림에서 공백을 제거하지만 더 효율적인 공백 제거 방법

istreams.get(characters, 50, ':'); 
istreams.get(c); 
istreams.getline(kill.killMap, 35); 
if(kill.killMap[0] = '\0) 
{ 
    cout << "Error; 
    break; 
} 
istreams >> ws; 

istreams.get(characters, 50, ':'); 
istreams.get(c); 
istreams.getline(kill.player, 35); 
if(kill.player[0] = '\0) 
{ 
    cout << "Error; 
    break; 
} 

, 나는 그것이 않는 생각하지 않는다

내 코드입니다

Map: Out of planet 
Player: Max 

:

은 내가 읽고 있습니다 파일입니다 char 배열과 동일합니다. 누군가가 나에게 공백

이를 제거하는 단지 효율적인 방법을 작동하거나 ws을 얻는 방법을 말할 수 있다면 정말 감사하겠습니다 것은 내가 무엇입니까 무엇 :

cout << kill.killMap << endl; 
    Out of planet //THERE IS WHITESPACE 
cout << kill.player << endl; 
     Max //THERE IS WHITESPACE 

내가 정말 원하는 것 :

cout << kill.killMap << endl; 
Out of planet // NOTICE THERE IS NO WHITESPACE 
cout << kill.player << endl; 
Max    // NOTICE THERE IS NO WHITESPACE 

C++ strings 또는 Vectors을 사용하지 않고이 작업을 수행 할 수 있습니까? 내가 사용하려고합니다 C Style strings

+0

실제로 얻는 결과는 무엇입니까? – 0x499602D2

+1

귀하의 질문은 현재 명확하지 않습니다. 지금 정확히 무엇을 얻고 있으며 대신 무엇을 얻고 싶습니까? –

+0

@JerryCoffin, 편집 된 질문을 참조하십시오. –

답변

0

처음에는 문자 배열을 사용하지 마십시오. 이것은 std::string으로 깨끗이 정리할 수 있습니다.

  1. 만들기 : 여기 Demo

    istreams.ignore(std::numeric_limits<std::streamsize>::max(), ':'); 
    if (!std::getline(istreams >> std::ws, kill.killMap) || kill.killMap.empty()) 
    { 
        std::cerr << "There has been an error\n"; 
        break; 
    } 
    
    istreams.ignore(std::numeric_limits<std::streamsize>::max(), ':'); 
    if (!std::getline(istreams >> std::ws, kill.killMap) || kill.killMap.empty()) 
    { 
        std::cerr << "There has been an error\n"; 
        break; 
    } 
    

    는 다른 대안 : 다음 코드는 표준 문자열 클래스에 문자의 배열에서 멤버 변수를 변경 한 가정 : 앞에 오는 첫 번째 문자를 무시하는 필터링 스트림 버퍼.

  2. 매 반복마다 수행했던 것처럼 ignore()을 호출하는 스트림 반복자를 만듭니다.
  3. regular expressions을 사용하면 각 줄의 패턴을 일치시키고 문자열로 추출 할 수 있습니다.
+0

고마워요.하지만 제 코드를 도울 수 있다면 캐릭터 배열을 사용하려고합니다. 문자열'. 나는 그것을 조정할 필요가있는 두 줄 또는 라인이라고 확신하지만, 당신이 나를 도왔다면 많은 것을 의미 할 것입니다. –

1

조작자 std::ws은 즉시 공백을 사용합니다. 형식의 형식의 공백 문자 자동 건너 뛰기를 활성화/비활성화하려면 std::skipws 또는 std::noskipws을 사용하십시오. 기본적으로 공백을 건너 뛰는 것이 가능합니다. 그러나 [올바르게 구현 된] 입력 연산자 (>>)에만 적용됩니다.

당신은 다른 답변처럼 입력하기 전에 공백을 먹는 기능을 쓸 수 있습니다 : 당신이 std::ws를 사용하는 거라고 포맷되지 않은 입력 앞에

(std::cin >> std::ws).get(c); 
+0

어떻게'C 스타일 문자열 배열 '과 함께 사용합니까? –

+0

'(std :: cin >> std :: ws) .getline (s, n)'의 문제점은 무엇입니까? –

+0

모든 것! 나는 'cin'이 아닌'istream operator'를 사용하고 있습니다! 또한':'구분자 뒤에 아무 것도없는 경우 어떻게됩니까? 그것은 다음 줄을 읽을 것이고 나는 그 일이 일어나기를 원하지 않는다. –

0

을 예컨대을 공백을 건너 뛰려면.스트림에서 작업 할 때 당신 만 제거 할 수 있지만

string trim(const string& s) 
{ 
    string res; 
    size_t pos1,pos2; 
    pos1 = s.find_first_not_of(" \t\r\n"); 
    pos2 = s.find_last_not_of(" \t\r\n"); 
    if(pos2!=string::npos) 
     pos2++; 
    res = s.substr(pos1,pos2-pos1); 
    return res; 
} 

이 같은

:

또한 문자열의 시작과 끝의 공백을 트림 트림 기능을 쓸 수 있습니다 선행 공백, 문자열 작업시 꼬리 공백을 제거 할 수도 있습니다.

get (cin>>)이 오기 전에 스트림의 공백을 사용해야합니다.