0

私は次のコードを持っています。正しく入力されたベクトルを取得します。しかし、ディレクトリからのファイル名であるベクターコンテンツを印刷または使用することができません。最初のイテレーションに入るとすぐに。すべてが失われます。私は何が間違っているのですか?

wprintf - This works OK

wcout-- here is where everything ends up corrupted

#include <windows.h>
#include <sstream>
#include <string>
#include <vector>
#include<iostream>
void GetAllFiles(vector<LPCWSTR>&, wstring);
using namespace std;
void main (void)
{
    vector<LPCWSTR> files(0);
    wstring path = L"Datasets\\Persons\\";
    wstring ext = L"*.*";
    wstring fullPath = path+ext;
    GetAllFiles(files,fullPath);    
    for (unsigned i=0; i<files.size() ; i++)
    {
        try
        {
            wcout<<"::\n"<<files[i];
        }
        catch(exception &ex)
        {
            cout<<"Error:"<<ex.what();
        }
    }

}

void GetAllFiles(vector<LPCWSTR>& fileNames,wstring dir)
{

    WIN32_FIND_DATA search_data;
    memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
    HANDLE handle = FindFirstFile(dir.c_str(),&search_data);
    while(handle != INVALID_HANDLE_VALUE)
    {
        wprintf(L"Found file: %s\r\n", search_data.cFileName);
        fileNames.push_back(search_data.cFileName);
        if(FindNextFile(handle, &search_data) == FALSE)
            break;
    }   
}

出力のスクリーンショットを添付しました。

GetAllFiles(...)でディスクを読み取るときに修正する

ループの最初の反復が行われるとすぐに破損します

4

2 に答える 2

2

search_data.cFileNameFindFirstFile/FindNextFileイテレータインターフェイスによって制御されるメモリへのポインタです。ポイントされたメモリは反復ごとに変化する可能性があるため(または反復の完了後に解放される可能性があるため)、このポインタ値を格納することはできません。

代わりに、たとえばを使用して、ベクトルに配置する文字列のコピーを作成する必要がありますwcsdup。さらに良いことに、ベクトルをとして定義すると、の内容でがvector<wstring>作成push_back(search_data.cFileName);されます。wstringsearch_data.cFileName

于 2012-09-16T19:31:43.597 に答える
-1

ローカル変数をpush_back()に渡すため、おそらくこれが発生しています。ここではわかりませんが、ここで何が起こる可能性がありますか。push_backはLPCWSTR型のオブジェクトを予期しますが、代わりにchar*を渡します。この変換がどのように行われるかはわかりませんが、おそらくポインターがコピーされたばかりであり、関数から戻るとこのポインターの値が無効になります。文字列をpush_backに渡す前に、明示的にコピーしてみてください。

于 2012-09-16T19:31:57.027 に答える