Изменение аргументов C ++ во время работы - PullRequest
3 голосов
/ 12 апреля 2011

У меня очень простая функция, которая должна читать текстовый файл и возвращать все строки по одному вектору строки типа.Я прошел несколько раз с отладчиком, и единственное, что я заметил, это то, что значение 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;
}

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

У меня есть эта функция, которая должна возвращать имена файлов всех текстовых файлов в текущем каталоге.

   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]);
    }
}

1 Ответ

5 голосов
/ 12 апреля 2011

Могу поспорить, что вы получите ваше имя файла от функции, которая возвращает указатель на локальную переменную, например, что-то вроде этого:

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

Выше указано недопустимое - Filename содержимоев стеке, и будет недействительным, когда getFilename() вернется.vector<string> fileLines; будет находиться в той же памяти, и поэтому данные, на которые указывает fileName, изменятся при переходе через конструктор vector.

РЕДАКТИРОВАТЬ: см., Например, Предупреждение компилятора C ++ - возвратлокальная переменная для получения дополнительной информации об этом

...