2010-08-14 2 views
1

가 ---- ----이 가 C++ : 파일, 인코딩 및 데이터 유형

문제는 내가 찾은 편집 ---------

입니다 ------

곳 닫아 주시기 바랍니다 . 나는 ----------------------

.... 실제 문제에 대한 새로운 질문을 시작하겠습니다

 


안녕,

내 상황 :

Linux (Ubuntu 10.04) 
gcc 

하지만 플랫폼에 독립적이어야합니다.

¥ © ® Ỳ È Ð과 같은 특수 문자가있는 텍스트 파일 (UTF-8)이 있습니다. 나는 std::map이 특수 문자를 보유하는 키에 대한 데이터 형식을 갖고 싶습니다. 현재 wchar_t을 사용 중입니다.

그런 다음이 문자를 포함 할 수있는 문자열을 사용해야합니다. 이제 std::wstring을 사용 중입니다.

해당 UTF-8 파일을 읽어야합니다. 그래서 나는 wifstream을 사용하는 것으로 생각했다. 그리고 라인 프로세싱을 위해 나는 wstringstream을 사용했다.

나는 이것이 나쁘지 않다라고 생각한다, 내가 지금까지 해왔 던 것이 ... 그렇지 않다면, 무엇이 더 낫지?

잘못 무엇을 것입니다 :

은 물론, 내가 그 파일을 읽을 수 있습니다. 그러나 줄을 읽는 것은 특별한 줄을 써서 첫번째 줄에서 멈춘다. 간단히 말해서 내가 한 일입니다.

map<wchar_t, Glyph*> glyphs; 

//... 

wifstream in(txtFile.c_str()); 
if (!in.is_open()) 
{ 
    throw runtime_error("Cannot open font text file!!"); 
} 
wstring line; 
while (getline(in, line)) // edit 
{ 
    printf("Loading glyph\n"); 
    if (line.length() == 0) 
    { 
    continue; 
    } 
    wchar_t keyChar = line.at(0); 
    /* First, put the four floats into the wstringstream */ 
    wstringstream ss(line.substr(2)); 
    /* Now, read them out */ 
    Glyph *g = new Glyph(); 
    ss >> g->x; 
    ss >> g->y; 
    ss >> g->w; 
    ss >> g->h; 
    glyphs[keyChar] = g; 
    printf("Glyph `%c` (%d): %f, %f, %f, %f\n", keyChar, keyChar, g->x, g->y, g->w, g->h); 

} 

그래서 질문입니다. wifstream을 사용하여 특수 문자로 파일을 읽는 방법은 무엇입니까?

미리 감사드립니다. 파일이 보이는 방법

:

0.000000 0.000000 0.010909 0.200000 
A 0.023636 0.000000 0.014545 0.200000 
B 0.050909 0.000000 0.014545 0.200000 
C 0.078182 0.000000 0.014545 0.200000 
D 0.105455 0.000000 0.014545 0.200000 
E 0.132727 0.000000 0.014545 0.200000 

....

È 0.661818 0.400000 0.014545 0.200000 
É 0.689091 0.400000 0.014545 0.200000 
Ê 0.716364 0.400000 0.014545 0.200000 
Ë 0.743636 0.400000 0.014545 0.200000 
Ì 0.770909 0.400000 0.012727 0.200000 
Í 0.796364 0.400000 0.012727 0.200000 
Î 0.821818 0.400000 0.012727 0.200000 
Ï 0.847273 0.400000 0.012727 0.200000 
Ð 0.872727 0.400000 0.014545 0.200000 
Ñ 0.900000 0.400000 0.014545 0.200000 

답변

1
  1. 사용 while(!in), 그것은 더 나은, this question

  2. 나는 당신이 윈도우를 사용한다고 가정하고있다. 이 UTF-8 플랫폼 인코딩을 사용하면 대부분의 내용을 무시할 수 있습니다. :) char들로 전체 파일을 읽고 내게로 this question에 편리한 기능을 사용하여 wchar_t 년대로 변환됩니다 내가 할 것

.

기억 : Linux에서 (아마도 mac os x도 마찬가지입니다) 터미널에 UTF-8 스트림을 출력하고 Windows에서 올바른 문자를 얻을 수 있습니다. 이는 완전히 다른 이야기입니다.

+0

@Martijn :'std :: string'을 사용하여 처리하고 UTF-8 string-char를 가져와야합니다. 'wchar_t'는 편리하지도 않고 플랫폼을 넘어서는 것도 아닙니다. 공간을 구분 기호로 사용하고'std :: string'에 UTF-8 문자 (1-4 바이트 너비)를 저장하거나 정말로 'char *'를 원한다면 저장할 수 있습니다. 'std :: wifstream'은'wchar_t's (리눅스에서는 UTF-32로, Windows에서는 UTF-16으로 변환됩니다)를 읽기위한 것이지 UTF-8이 아닙니다. – rubenvb

0

불행하게도 C++는 여기에 조금 부족하다 - wifstream에서 w가보다는, 사용 유형을 말한다는 와이드 문자로 파일을 처리하는 기능.당신은 자신에 대한 몇 가지 코딩을해야 할 것이다, 그러나 당신이에 조리법을 찾을 수 있습니다 대신 eof 변형의

  1. Reading UTF-8 with C++ streams
  2. Upgrading an STL-based application to use Unicode
0

STL 컨테이너를 사용할 필요가없는 경우 Qt 프레임 워크를 사용하는 것이 좋습니다. Qt는 유니 코드를 표준으로 사용합니다. 또한, 수업은 매우 잘 디자인되어 사용하기에 정말로 좋은 느낌을줍니다.

원하는 작업을 수행 할 QTextStream을 만들 수 있습니다.

http://doc.trolltech.com/latest/qtextstream.htm

나는 다음과 같은 코드가 수행해야합니다 생각합니다.