2012-02-03 5 views
1

좋아요, 그래서 이것은 텍스트 파일에서 발생하는 기괴한 크로스 플랫폼 문제입니다. 나는 매우 간단Windows 및 Linux 텍스트 파일 처리 문제

// reading a text file 
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    ifstream myfile ("example.txt"); 
    if (myfile.is_open()) 
    { 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     if (line == "BEGIN") 
     cout << line << endl; 
    } 
    myfile.close(); 
    } 

    else cout << "Unable to open file"; 

    return 0; 
} 

그래서이 텍스트 파일을 읽고 텍스트 파일을 읽고는 BEGIN가 발생하면 읽고있는 줄을 뱉어 프로그램을 말해봐. 다음은 내가 읽은 텍스트 파일입니다.

HEADER 
BEGIN 
X 2 
Y 2 
Z 1 
END 

Windows는 한 번 만난 이후 BEGIN을 한 번 뱉어냅니다. 리눅스는 아무것도 내뱉지 않는다. 내가 여기서 누락 된 근본적인 것이 있습니까? 파일이 윈도우 라인 엔딩이있는 경우

+0

LF (Unix) 대신 CRLF (Windows) 줄 끝을 사용하고 있습니까? ? CRLF를 사용하는 경우 CR을 라인의 일부로 읽는 것일 수 있습니다. –

답변

7

(즉, 모든 라인이 오히려 리눅스가 기대처럼 줄 바꿈보다, 캐리지 리턴 + 줄 바꿈로 끝나는), 다음 line 리눅스에 "BEGIN\r"보다는 "BEGIN" 될 것입니다.

이 문제를 해결하려면, 당신은 리눅스 라인 엔딩으로 변환 할 파일에 dos2unix을 실행할 수 있습니다

dos2unix example.txt 

을 다른 방법으로, 두 시스템 모두에 동일하게 파일을 원하는 경우, 당신이 그것을 열 수 있습니다 텍스트 모드가 아닌 이진 모드 :

ifstream myfile ("example.txt", ios_base::binary); 

그런 다음 두 시스템이 같은 방법으로 파일을 읽습니다. (Windows 줄 끝을 사용하는 경우 프로그램에서 캐리지 리턴을 처리해야하지만 적어도 일관된 동작을 보게됩니다.)

+0

아, 정말 고마워요! –

+0

@VincentRusso : 환영합니다! – ruakh