2013-01-12 1 views
1

텍스트 파일을 읽을 때 C++을 선택하려고하는데 오류가 발생합니다. 왜 그런가?C++ 문제 텍스트 파일 읽기

입력 :

This is a test. 
    A test, with tabs and too many spaces. 
If this is a good one, 
    then all will be well. 

출력 :

then all will be well. too many spaces. 

코드 :

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

int main() {  

    string line; 

    ifstream infile ("A5.txt"); 

    if (infile.is_open()) { 
     while (!infile.eof()) { 
      getline(infile,line); 
      cout << line << endl; 
     } 
     infile.close(); 
    } 
return 0; 
} 
+0

어떤 OS/C++ 컴파일러입니까? – ybungalobill

+0

OSX 10.7/Netbeans 7.2 –

+2

'while (! infile.eof())'구조를 잃어 버렸습니다. "파스칼 병"이라고도합니다. C/C++에서 eof()는 파일 끝을 지나서 * 읽을 때까지 * true *가 아니므로 getline() *을 너무 많이 * 한 번 호출합니다. 'while (getline (infile, line))'은 그러한 루프를 작성하는 관용적 인 올바른 방법입니다. – arayq2

답변

5

당신은을 반환 \r을 (\n를) UNIX 라인 엔딩을 사용하고 해석 구현을 사용 커서를 줄의 시작 부분으로 이동하십시오. 파일에 이전 Mac OS 줄 끝 (\r)이 포함되어 있습니다. 즉, getline()은 파일의 끝까지 읽히고 모든 \r을 나중에 콘솔로 인쇄하게 만듭니다.

+0

OP가 MacOS-9에서 텍스트 파일을 만들었다는 것을 어떻게 알았습니까? :)'\ r' 가설은 조금 불안정하다. – akira

+0

@akira : 이것은 시스템이 제대로 작동한다고 가정 할 수있는 유일한 가능한 설명이다. OP는 16 진 뷰어를 사용하거나 루프를 실행하여 루프를 확인한 횟수를 계산할 수 있습니다.). – ybungalobill

+0

'\ r' 그 자체는 유효한 이론이지만 "오래된 마코"는 아닙니다. 나는 netbeans가 출력을 둘러싼다고 생각하고 싶습니다. '\ r'을 인쇄하면 묘사 된 행동이 실제로 발생합니다. imho의 출력 또는 출력의 해석이 아니라 여기에있는 입력입니다. – akira