2012-01-02 2 views
1
私は、現在のディレクトリのすべてのファイルを表示したいので、私はこのコードを持っている

リストディレクトリ

0029F29C 
0029F29C 
0029F29C 
0029F29C 
0029F29C 
0029F29C 
:私のプログラムは、この結果を表示して、未知の理由のために

int WLoader::listdir(void) 
{ 
    WIN32_FIND_DATA data; 
    std::wstring path(L"*"); 
    std::wstring *name; 
    HANDLE hFile = FindFirstFile(path.c_str(), &data); 

    if (hFile == INVALID_HANDLE_VALUE) 
     return (-1); 

    while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) 
    { 
     std::cout << data.cFileName << std::endl; 
    } 
    return (0); 
} 

誰かが私を助けることができますか?

+1

cFileName要素のアドレスポインタが、それに含まれる文字列の代わりに出力されているようです。代わりにprintf()を使ってみましたか? –

+0

ええ、それはprintfで動作しますが、私はdllを開くために必要なので、私は文字列にcFileNameを持つ必要があります。だから私はファイルの正しい名前を書くことができない場合、私は文字列に適切な名前を持つことはできませんと思います。 –

+0

@NickShaw:これはひどい考えです。彼がストリームしようとしていることではっきりと何かがあります。石の時代に戻すことは、おそらくその問題を解決し、おそらくそれを悪化させます。 –

答えて

4

The WIN32_FIND_DATA structure's member cFileName is a TCHAR[N]、およびTCHAR is a Windows type alias that maps either to char or wchar_t.問題がある使用。

ビルドの設定によっては、char*またはwchar_t*のいずれかです。 1つはstd::coutで、もう1つはstd::wcoutで使用する必要があります。しかしどちらを使うのですか?あなたはstd::string/std::wstringにファイル名を割り当てるしようとするが、同じ問題を見つけるつもりだ

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) { 
#ifdef UNICODE 
    std::wcout << data.cFileName << std::endl; 
#else 
    std::cout << data.cFileName << std::endl; 
#endif 
} 

幸いなことに、マクロを使用すると、コンパイル時に使用されているかを調べるためにあります。これがWindows APIを使用するためのものです。 :)

これを回避する方法の1つは、出力ストリームと文字列のマクロを定義することです。

だから、どこかにあなたのプログラムの先頭に:

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) { 
    STDCOUT << data.cFileName << std::endl; 
} 

、あなたが他の場所でSTDSTRを使用することができますあなたの関数で次に

#ifdef UNICODE 
#define STDCOUT std::wcout 
#define STDSTR std::wstring 
#else 
#define STDCOUT std::cout 
#define STDSTR std::string 
#endif 

、あなたが必要とするすべてです。

何か考慮する必要があります。

+0

わかりました。ご協力いただきありがとうございます。 –

+0

@Yumino:あなたは大歓迎です。 –

3

ワイド文字列を出力する場合は、std::coutを使用しています。代わりにstd::wcoutを使用してください。

+0

と私は文字列にcFileNameを入れたいのですか? –

+0

@Yuminoパスにはすでに 'std :: wstring'が使用されています。 –

+0

'wstring'に入れてください。 –

1

あなたはUnicode/ANSIの不一致があると思います。 Unicode文字列を印刷するには、あなたがあなたのコードを書くとき、それはになりますどちらかわからないstd::wcout

関連する問題