C++参数在运行时发生变化

Tom*_*Tom 3 c++ arguments readfile

我有一个非常简单的函数,它应该读取一个txt文件并通过一个类型字符串向量返回所有行.我已经使用调试器对它进行了几次调试,我唯一注意到的是"fileName"的值在ifstream声明的行上发生了变化.我究竟做错了什么??谢谢.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

我有这个函数应该返回当前目录中所有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;
    }
Run Code Online (Sandbox Code Playgroud)

这就是函数的调用方式:

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

Eri*_*rik 5

我敢打赌,你从一个函数中获取你的文件名,该函数返回一个指向局部变量的指针,例如:

char * getFilename() {
 char Filename[100] = "/foo";
 return Filename;
} 
Run Code Online (Sandbox Code Playgroud)

以上Filename内容无效 - 内容在堆栈中,getFilename()返回时无效.vector<string> fileLines;将位于相同的内存中,因此fileName当您单步执行vector构造函数时,数据指向将更改.

编辑:参见例如C++编译器警告 - 返回本地变量以获取更多信息