2011-04-12 58 views
3

我有一個非常簡單的函數,它應該讀取一個txt文件並將所有行返回一個類型字符串的向量。我已經使用調試器進行了幾次調試,並且我注意到唯一的事情是「fileName」的值在ifstream聲明的行上發生了變化。我究竟做錯了什麼??謝謝。在運行時改變C++參數

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

您是否在編譯時啓用了優化? – 2011-04-12 11:27:51

+0

你的代碼是不夠的。更好地發佈你的函數調用調用代碼。 – karthik 2011-04-12 11:30:05

+0

你的意思是什麼優化?我正在和Mingw編譯。 Thx – Tom 2011-04-12 11:30:14

回答

5

我的選擇將是你從哪個返回一個指向局部變量的函數,例如讓你的文件名是這樣的:

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

以上是無效的 - Filename內容堆棧,並會在getFilename()回報無效。 vector<string> fileLines;將位於同一內存中,因此當您跨越vector構造函數時,指向的數據fileName將會更改。

編輯: C++ compiler warning - returning local variable關於此的更多信息

+0

我想這正是我的問題。但我不知道我該如何回報它,它適用於我... – Tom 2011-04-12 11:46:00

+0

@Tom:使用'矢量' - 而不是'矢量'。然後讓'readFile'接受一個'const char *'並將'inputFileList [a] .c_str()'傳遞給它。 – Erik 2011-04-12 11:50:11

+0

Thx很多Erik,現在工作正常。 – Tom 2011-04-12 13:03:17