2010-03-21 6 views
0

그래, getline에 문제가 있습니다.C++ ifstream 멤버에 getline을 올바르게 사용하려면 어떻게해야합니까?

몇 개의 문자열이 포함 된 파일이 있습니다. 나는 혼자서 그것을 만들었고 나는 각 줄을 별개의 줄로 만들었다.

Ex. textfile.txt 
    Line 1 
    Line 2 
    Line 3 
    Line 4 

//Little snip of code 
    ifstream inFile("textfile.txt"); 
    getline(inFile, string1); 

프로그램을 디버그하여 string1을 출력하도록 요청하면 "줄 1 \ r"이 string1에 저장되었음을 나타냅니다. 나는 그것이 파일을 만들 때 실제적으로 입력을 때리는 것이란 것을 이해합니다. 이 문제는 내 프로그램 세그먼트 화 오류가 발생합니다. 나는 ofstream을 사용하여 파일을 먼저 작성한 다음 그것을 읽으면 내 코드가 작동한다는 것을 안다.

그래서 내 질문에 대해서는 어쨌든 getline 함수를 사용하지 않고 이스케이프 시퀀스 \ r을 사용하고 있습니까? 내가 분명하지 않다면 알려주세요.

+0

문제가 무엇인지 파악하기 위해 여기에 코드가 충분하지 않습니다. – msw

+0

더 큰 코드 샘플을 볼 수 있습니까? – RobS

+0

디버거에서 sd :: strings을 검사하는 경우 문자열 끝 부분에 "추가"문자가있을 수 있습니다. 문자열의 특성상 버그가 아닌 것으로 예상됩니다. 검사 할 때 문자열의 size()를 고려하십시오. –

답변

0

표준 라이브러리가 올바르게 구현 된 경우 종료 문자는 스트림에서 제거해야하지만 이 문자열에 추가되지 않습니다. 문자열에 추가 된 경우에도 segfault가 발생해서는 안됩니다. 문제는 다른 곳에 있다고 생각합니다.

1

'\ r'문자가 있다는 사실 자체로는 seg fault가 발생하지 않을 것입니다.

기타 신비 :
바이너리로 파일을 열면 출력이 출력됩니다.
텍스트로 쓰기 위해 파일을 열면 (기본값) '\ n'을 제외하고는 출력이 동일하며 줄 끝 시퀀스로 변환됩니다 (아래 내용 참조).

바이너리로 읽기 위해 파일을 열면 입력 내용이 파일에있는 내용과 정확하게 일치합니다.
텍스트로 읽기 위해 파일을 열면 (기본값), '\ n'문자로 변환되는 줄 종결 순서를 제외하고 입력 내용은 파일과 동일합니다.

정상적인 상황에서는 정상입니다. 그러나 모든 플랫폼은 라인 종단 시퀀스에 대한 자체 정의가있는 것으로 보입니다. 따라서 MAC에 텍스트 파일을 작성한 다음 PC에서 텍스트 파일을 읽으면 예상대로 작동하지 않을 수 있습니다.

다음 중 하나를 수행하지 않는 한 모든 것이 작동합니다. 텍스트 파일을 작성하고 OS1은/

  • OS1/OS2가없는 OS2 의 파일을 읽기 진
  • 에 읽기 텍스트에서
  • 쓰기/이진/독서의

    • 쓰기 동일한 회선 종단 시퀀스.

주 1 : 바이너리 모드로 파일을 작성하는 경우. 텍스트 모드를 가정하는 getline()을 사용해서는 안됩니다 (행 분리 시퀀스가 ​​분할 선을 기다리고 있습니다). Sub 참고 : pedal (s)에 대해서는 getline()이 바이너리에서 작동하지만 구현 세부 사항에 의존하고 있으므로 이식성을 고려해서는 안됩니다.

참고 2 : 위에서는 스트림 데이터를 즉시 변환하는 패싯을 구현하는 특수한 로컬을 설치하지 않았다고 가정합니다.

관련 문제