2012-04-07 2 views
1

미리 파일 크기를 알 수 없으므로 UTF8 인코딩의 파일을 wchar_t 버퍼로 읽는 데 문제가 있습니다.Win32에서 wchar_t 버퍼의 전체 파일을 읽으려면 어떻게해야합니까?

버퍼에서 전체 파일을 읽는 방법을 아는 사람이 있습니까?

내가 읽을 때 wchar_t * (포인터)를 유지하고 크기를 조정해야한다고 생각합니다. 그러나 나는 전에 포인터 크기를 변경하지 않은 것처럼 매우 무서운 것처럼 들립니다.

저는 Microsoft Visual Studio로 Windows C++ 프로그래밍을하고 있습니다.

+0

포인터를 "크기를 재조정"하기 위해'realloc'을 사용하십시오. – Gabe

+0

wchar_t [] 대신 std :: wstring을 고려하십시오. –

답변

2

벡터 사용을 고려 했습니까?

#include <vector> 
#include <fstream> 
#include <iterator> 

::: 

std::ifstream in(file_name); 

//Will automatically reallocate to the require size 
std::vector<wchar_t> store(
    std::istream_iterator<wchar_t>(in), 
    std::istream_iterator<wchar_t>()); 

//to access wchar_t* you can call data(); 
my_func(store.data()); 
+0

벡터 사용을 고려하지 않았습니다. 나 해보자! – bodacydo

+0

@bodacydo, 벡터를 사용하는 것은 훨씬 더 C++ 친화적 인 접근법입니다. 원시 포인터를 처리하는 것은 실제로 C이며 가능한 경우 벡터를 사용하면 오류가 발생하기 쉽습니다. – 111111

+0

@bodacydo 또한 개행과 공백을 원한다면 파일에서 건너 뛰기와 std :: ios :: binary를 설정해야한다는 것을 잊지 마십시오. – 111111

0

파일 크기의 버퍼를 할당하려면 먼저 파일 크기를 알아야합니다. 그렇게하기 위해 적절한 인수를 사용하여 stat() 함수를 호출하면 파일 크기가 포함 된 필드가 채워집니다.

가변 크기 filesize에 해당 크기를 저장한다고 가정합니다.

그런 다음 당신은 다음

wchar_t *buffer = reinterpret_cast< wchar_t * >new char [ filesize ]; 

라는 한 후 파일 기술자, 또는 FREAD()를 얻기 위해 그것을) (오픈라는 한 후,) (읽기 사용하여, 그 버퍼에 전체 파일을 읽을 수 있습니다 FILE *을 얻으려면 fopen()을 사용하십시오.

+0

감사! 나는'wchar_t'에서 파일을 읽거나'char'에서 먼저 읽은 다음'char'을'wchar_t'로 변환해야합니까? – bodacydo

+0

read() 및 fread()는 (부호없는) char 버퍼로 작업하고 있다고 생각합니다. 그러나 그들은 정말로 신경 쓰지 않습니다. 속임수는 버퍼의 크기가 바이트에 비례한다는 것입니다. stat는 파일 크기를 바이트 단위로 알려주기 때문입니다. 그러나 wchar_t에 대한 포인터로 만들고 읽은 후에 wchar_t로 처리 할 수 ​​있습니다. – DRVic

관련 문제