2011-04-12 3 views
3

나는 txt 파일을 읽고 모든 행을 유형 문자열의 하나의 벡터로 반환해야하는 매우 간단한 함수를 사용했습니다. 필자는 디버거를 사용하여 여물을 밟았으며, 주목할 점은 ifstream 선언의 줄에서 "fileName"값이 변경된다는 것입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?? 고마워. //////////////////////////////////실행 중 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

최적화 기능을 사용하여 컴파일 중입니까? –

+0

코드가 충분하지 않습니다. 함수 호출 호출 코드를 게시하는 것이 더 낫습니다. – karthik

+0

최적화와 관련하여 어떤 의미입니까? 나는 Mingw와 함께 컴파일하고있다. Thx – Tom

답변

5

내 내기는 로컬 변수에 대한 포인터를 반환하는 함수, 예를 들어,에서 파일 이름을 얻을 것 이 같은 : 위의

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

가 유효하지 않습니다 - Filename 내용은 스택에, 그리고 때 getFilename() 수익을 무효화됩니다. vector<string> fileLines;은 동일한 메모리에 있으므로 vector 생성자를 단계적으로 실행하면 데이터 fileName가 변경됩니다.

편집 : 예. 이 내용에 대한 자세한 내용은 C++ compiler warning - returning local variable

+0

그게 내 문제 야. 그러나 나는 그것이 내가 그것을 위해 일하는 것을 어떻게 돌려 주어야하는지 모르겠다. – Tom

+0

@Tom : '벡터 '- '벡터 '이 아닌 '벡터 '을 사용한다. 그런 다음'readFile'을'const char *'로 만들고'inputFileList [a] .c_str()'을 전달합니다. – Erik

+0

Thx 많은 에릭, 지금은 잘 작동하고 있습니다. – Tom

관련 문제