3

txt ファイルを読み取り、文字列型の 1 つのベクトルですべての行を返す非常に単純な関数があります。私はデバッガーを使って何度もそれを試しましたが、私が気付いた唯一のことは、ifstream 宣言の行で "fileName" の値が変化することです。私は何を間違っていますか?? どうも。

vector<string> readFile(char* fileName)
{
    vector<string> fileLines;
    fileLines.clear();
    string line;
    ifstream myfile (fileName);
    if (myfile.is_open())
    {
        while ( myfile.good() )
        {
            getline (myfile,line);
            fileLines.push_back(line);
        }
        myfile.close();
    }
    return fileLines;
}

/////////////////////////////////

現在のディレクトリにあるすべてのtxtファイルのファイル名を返すこの関数があります。

   vector<char*> getFileList()
    {
        vector<char*> fileNames;
        fileNames.clear();
        WIN32_FIND_DATA FindFileData;
        HANDLE hFind = INVALID_HANDLE_VALUE;
        char currentPath[_MAX_PATH];
        getCurrentPath(currentPath);
        strncat(currentPath, "\\*", 3);
        if (hFind = FindFirstFile(currentPath, &FindFileData))
        {

            string fileExtension = getExt(FindFileData.cFileName);
            if (fileExtension == "txt" || fileExtension == "TXT")
            {
                fileNames.push_back(FindFileData.cFileName);
            }
            while(FindNextFile(hFind, &FindFileData) != 0)
            {
                string fileExtension = getExt(FindFileData.cFileName);
                if (fileExtension == "txt" || fileExtension == "TXT")
                    fileNames.push_back(FindFileData.cFileName);
            }
        }
        return fileNames;
    }

関数が呼び出される方法は次のとおりです。

vector<char*> inputFileList = getFileList();
if (inputFileList.size() > 0)
{
    for (int a=0; a<inputFileList.size(); a++)
    {
        fileLines = readFile(inputFileList[a]);
    }
}
4

1 に答える 1

5

私の賭けは、ローカル変数へのポインターを返す関数からファイル名を取得することです。たとえば、次のようなものです。

char * getFilename() {
 char Filename[100] = "/foo";
 return Filename;
} 

上記は有効ではありません -Filenameコンテンツはスタック上にあり、getFilename()返されると無効になります。vector<string> fileLines;同じメモリに配置されるため、コンストラクターfileNameをステップオーバーすると、データポイントが変更されます。vector

編集:これに関する詳細については、たとえばC++ コンパイラの警告 - ローカル変数を返すを参照してください

于 2011-04-12T11:30:25.997 に答える