2013-03-14 4 views
3

파일을 반복하여 모든 문자열을 인쇄하고 싶습니다. 예를 들어, 파일이 포함되어파일 반복을 통해 반복 수행

a 
1 
2 
10 
a1 
1 
b 

출력됩니다 :

a 
a1 
b 

내가 이렇게 내 코드를 작성 :

int main(){ 
    ifstream stream; 
    stream.open("example.txt"); 
    string temp; 
    while (getline(stream, temp)){ 
    cout<<temp<<endl; 
    int n; 
    while(stream>>n){} 
    } 
} 

이 프로그램을 온라인으로 인쇄 "A"와 "A1"를. 제안?

+2

'while (stream >> n) {}'다음에 실패 상태를 지우지 마십시오. – ildjarn

+0

@ildjarn 모든 정수를 반복 할 때 사용합니다. –

+1

* 매우 * 좋게 질문합니다. –

답변

1

어떨까요?

std::copy_if(std::istream_iterator<string>(stream), std::istream_iterator<string>(), 
      std::ostream_iterator<string>(std::cout), 
      [](std::string const& rhs) { return !std::isdigit(rhs[0]); }) 
+0

나는 프로그래밍에 새로운 사람입니다. 나는 그런 것을 사용하는 것이 허락되지 않는다고 생각합니다. 지금까지 getline은 문자열을 읽는 데 사용되며 stream >> n은 int를 읽는 데 사용됨을 알고 있습니다 –

+0

@JessicaHerlian cppreference.com을 사용하여 작업 할 경우 교수님보다 훨씬 많은 것을 배우게됩니다. 너를 가르쳐! –

+0

@ JessicaHerlian 물론 당신이 알아낼 수없는 것을 설명해 주셔서 감사합니다. –

0

문자열이 비어 있지 않고 문자로 시작한다면 맞습니까? 어떻게됩니까

if (temp.size() > 0 && isalpha(temp[0])) 
{ 
    cout << temp; 
} 
3

은 다음과 같습니다 프로그램이 줄을 명중하면,

while(stream>>n){} 

int egers의 파일에서 다음 토큰을 읽는 시도합니다. 1이 (가) 성공합니다. 2이 (가) 성공했습니다. 10이 (가) 성공했습니다. a1이 실패합니다.

stream은 현재 장애 상태 (stream.fail() == true)입니다. 코드가 실행 다음 문은

while (getline(stream, temp)){ 

않습니다 다음 토큰 (a1를) 읽을 수 있지만 stream가 실패 상태에 있기 때문에, getline의 결과는 false으로 해석되며, 루프가 중단됩니다 .

그래서 프로그램이 중간에 종료되는 이유입니다. 그러나 심지어는 a1을 인쇄해서는 안됩니다. 실제로, 그것은 내 컴퓨터에 a만을 인쇄합니다.

루프 내부의 정수 토큰을 먹은 후 실패 상태를 지울 필요가 있습니다. 끝에 다음 문을 추가

stream.clear(); 

를 이것은 실패 상태 (stream.fail() == false)를 재설정하고 외부 루프는 계속 실행됩니다.

+1

OP의 해결책이 작동하지 않는 이유를 설명하는 +1. –

관련 문제