2012-01-22 4 views
2

줄마다 파일을 읽고 각 줄을 문자열에 추가하고 있습니다. 그러나 줄 바꿈 문자 때문에 줄 길이가 1 씩 증가합니다. 어떻게 그것을 복사에서 제거 할 수 있습니다.문자열에 줄 바꾸기 줄 바꾸기

다음은 동일한 코드를 작성한 코드입니다.

if (inputFile.is_open()) 
{ 
    { 
     string currentLine; 
     while (!inputFile.eof()) 
      while(getline(inputFile, currentLine)) 
      { 
       string s1=currentLine; 
       cout<<s1.length(); 
      } 

[업데이트 된 설명] 나는 메모장을 사용하여 내가 뭘 선의 길이를 결정합니다. 그래서 그들은 내 프로그램이 124,451,501,120을 보여주는 약 123, 450, 500, 120을 보여주고 있습니다. 마지막 행을 제외하고 모든 line.length()는 1만큼 증가 된 값을 표시합니다.

그것은 inputFile처럼 보이는
+6

StackOverflow에 오신 것을 환영합니다. 나는 당신을 위해 당신의 코드를 형식화했다. 첫 번째는 무료입니다. 그 후 당신은 내게 파인트를 사야 만한다 ;-) – Johnsyweb

+0

'std :: getline()'은 개행 문자를 버린다. 예상 줄 길이는 어떻게 결정합니까? – hmjd

+0

cout << s1.length() 사용하기; – typedef1

답변

6

는 Windows 스타일 line-breaks (CRLF)을 가지고 있지만 프로그램이, (LF) 행 구분 유닉스 계열의 입력을 분할되어 std::getline() 때문에,에 CR (\r)를 떠나 기본적으로 \n에 휴식 당신의 문자열의 끝.

외부의 \r을 트리밍해야합니다. 여기에 작은 테스트와 함께, 그것을 할 수있는 한 가지 방법은 다음과 같습니다

#include <iostream> 
#include <sstream> 
#include <iomanip> 

void remove_carriage_return(std::string& line) 
{ 
    if (*line.rbegin() == '\r') 
    { 
     line.erase(line.length() - 1); 
    } 
} 

void find_line_lengths(std::istream& inputFile, std::ostream& output) 
{ 
    std::string currentLine; 
    while (std::getline(inputFile, currentLine)) 
    { 
     remove_carriage_return(currentLine); 
     output 
      << "The current line is " 
      << currentLine.length() 
      << " characters long and ends with '0x" 
      << std::setw(2) << std::setfill('0') << std::hex 
      << static_cast<int>(*currentLine.rbegin()) 
      << "'" 
      << std::endl; 
    } 
} 

int main() 
{ 
    std::istringstream test_data(
     "\n" 
     "1\n" 
     "12\n" 
     "123\n" 
     "\r\n" 
     "1\r\n" 
     "12\r\n" 
     "123\r\n" 
     ); 

    find_line_lengths(test_data, std::cout); 
} 

출력 :

The current line is 0 characters long and ends with '0x00' 
The current line is 1 characters long and ends with '0x31' 
The current line is 2 characters long and ends with '0x32' 
The current line is 3 characters long and ends with '0x33' 
The current line is 0 characters long and ends with '0x00' 
The current line is 1 characters long and ends with '0x31' 
The current line is 2 characters long and ends with '0x32' 
The current line is 3 characters long and ends with '0x33' 

주의하기 : 당신은 EOF를 테스트 할 필요가 없습니다

  • . std::getline()inputFile에서 더 이상 읽을 수 없으면 false으로 캐스팅 할 스트림을 반환합니다.
  • 길이를 결정하기 위해 문자열을 복사 할 필요가 없습니다.
+0

나는 라인별로 라인을 선택하는 길이를 결정하기 위해 npp ++를 사용했다. 그래서 그들은 내 프로그램이 124,451,501,120을 보여주는 약 123, 450, 500, 120을 보여주고 있습니다. 마지막 행을 제외하고 모든 line.length()는 1만큼 증가 된 값을 표시합니다. – typedef1

+0

수작업으로 계산할 수있는 선 길이가있는 훨씬 더 작은 테스트 파일에 대해 프로그램을 실행할 수 있습니까? 길이가 0 인 줄에 대해 무엇을보고합니까? (내 보고서 0) – Johnsyweb

+1

체크 아웃 ... – typedef1

1

MS-Windows를 사용하고 있고 "\ r"앞에 "\ r"을 추가하고 "\ r"이 제거되지 않았기 때문에 그 때문입니다.

+1

맞지 않습니다.'\ r'도 제거됩니다 (http://stackoverflow.com/a/6089413/237483). 파일이 Windows에 저장되어 있고 Linux에서 읽으면 문제가됩니다. –

+0

@ChristianAmmer 나는이 문제가 ** 큰 문제라고 생각한다. 물론, Windows 컴퓨터에서 텍스트 모드로 파일을 읽을 때, 줄의 끝은'\ n'으로 바뀝니다.이 줄은 지워지지만,이 줄 끝의 멋진 보이지 않는 문자는 쉽게 읽을 수 있습니다. 이것이 사실인지 확인하는 것은 간단합니다 :'if (! s.empty() && s.back() == '\ r') {std :: cout << "gotcha! \ n"; }' –

+0

예 유닉스에서 파일을 읽습니다.창문에 저장 – typedef1