我有一个非常简单的函数,它应该读取一个txt文件并通过一个类型字符串向量返回所有行。我已经使用调试器对它进行了几次调试,我唯一注意到的是“fileName”的值在ifstream声明的行上发生了变化。我究竟做错了什么?? THX。
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]);
}
}
答案 0 :(得分:5)
我的赌注是你从一个函数中获取你的文件名,该函数返回一个指向局部变量的指针,例如:像这样的东西:
char * getFilename() {
char Filename[100] = "/foo";
return Filename;
}
以上内容无效 - Filename
内容在堆栈中,并且在getFilename()
返回时无效。 vector<string> fileLines;
将位于同一内存中,因此当您跨过fileName
构造函数时,数据vector
指向的位置会发生变化。
编辑:参见例如C++ compiler warning - returning local variable了解有关此内容的更多信息