【问题标题】:C++ arguments changing while runningC++ 参数在运行时发生变化
【发布时间】:2011-04-12 11:24:39
【问题描述】:

我有一个非常简单的函数,它应该读取一个 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;
}

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

我有这个函数应该返回当前目录中所有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]);
    }
}

【问题讨论】:

  • 您是否在启用优化的情况下进行编译?
  • 你的代码不够用。最好贴出你的函数调用调用代码..
  • 优化是什么意思?我正在用 Mingw 编译。谢谢
  • 看起来没问题,函数是怎么调用的? 'fileName' 里面具体是什么?

标签: c++ arguments readfile


【解决方案1】:

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

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

以上无效 - Filename 的内容在堆栈上,当getFilename() 返回时将失效。 vector&lt;string&gt; fileLines; 将位于同一内存中,因此当您跨过 vector 构造函数时,fileName 指向的数据将发生变化。

编辑:参见例如C++ compiler warning - returning local variable 了解更多信息

【讨论】:

  • 我想这正是我的问题。但我不知道我应该如何归还它对我有用...
  • @Tom:使用vector&lt;string&gt; - 而不是vector&lt;char *&gt;。然后让readFile 取一个const char * 并将inputFileList[a].c_str() 传递给它。
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2015-09-14
  • 2013-07-05
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多