2009-10-23 2 views
0

내 과제에 간단한 UTF-8 디코더를 쓰려고합니다. 나는 C++에서 상당히 새롭다. ...C++의 ifstream 위치

나는 인코딩이 유효한지 아닌지를 결정해야하고, 두 경우 모두 UTF-8 문자의 값을 16 진수로 출력해야한다. 첫 번째 바이트를 읽고이 첫 번째 바이트를 사용하여이 UTF8 문자의 바이트 수를 확인한다고 가정 해보십시오. 문제는 첫 번째 바이트를 읽은 후 ifstream 위치를 1 바이트 뒤로 설정하고 전체 UTF-8 문자를 읽는 데 문제가 있다는 것입니다. seekg() 및 putback()을 시도했지만 항상 테스트 데이터가 아닌 버스 오류 또는 이상한 출력을 얻습니다. 도와주세요, 고마워요.

비록 첫 번째 바이트에 peek()을 사용할 수 있지만 인코딩이 유효한지 여부를 결정하기 위해 다음 바이트를 읽어야합니다. 스트림 위치를 다시 설정하는 문제는 여전히 있습니다.

+0

그것은 당신이지고있는 오류를 보여주는 코드의 작은 조각을 게시 도움이 될 수 있습니다. –

답변

2

대신 peek()을 사용하여 첫 번째 바이트를 읽는 것이 좋습니다. seekg()는 되감기 위해 작동해야하지만 BUS 오류는 대개 코드에서 정렬 문제가 발생하여 코드에서 악의적 인 일을하고 있음을 나타냅니다.

2

왜 다시 찾으십니까? 얼마나 많은 옥텟을 기대하고 있는지 알았 으면 나머지 UTF-8 시퀀스를 읽을 수 없습니까?

+0

나는 16 진수 값으로 전체 문자를 출력해야합니다. – cplusplusNewbie

+0

OK, 이미 첫 번째 바이트가 있습니다. 나머지를 읽고 모두 출력하십시오. 나는 왜 당신이 돌아갈 필요가 있는지 이해하지 못합니다. –

1

나는 다음 바이트를 직접 읽고 그것을 내가 가진 것에 추가 할 것이다. Ates Goral이 말했듯이. 그것은 깨끗한 IMHO입니다.

char byte = 0; 
unsigned int character = 0; // on every usage 
ifstream file("test.txt", ios::binary); 

file.get(byte); 
...... 
file.seekg(-1, ios::cur); // cur == current position 
file.get(
    reinterpret_cast<char*>(&character), 
    numberOfBytesAndNullTerminator); 

cout << hex << character; 

는 두 번째 경우에 그 get()을 조심 character의 말에 '\0'을 기록 :

어쨌든, 당신은 seekg()를 사용하여 스트림 포인터를 이동할 수 있습니다. 따라서 널 종결자를 포함하여 필요한 바이트 수를 지정해야합니다. 따라서, 2 바이트 인 ==> numberOfBytesAndNullTerminator = 3을 읽으려는 경우.

0

왜 캐릭터를 다시 넣어야할지 모르지만 istream :: unget() 또는 istream :: putback()은 원하는 것을해야합니다. 컴파일러의 설명서를 참조하십시오.

-1

찾아주십시오 :

ifstream::seekg() 
ifstream::teellg()