2017-03-30 2 views
0

그래서 파일을 통해 줄을 읽는 줄을 만들려고하고 줄을 기반으로 물건을 만들지 만, 몇 줄은 내가 열고 시작해야하는 다른 파일 이름이 될 수 있다는 것을 제외하고는 이 파일을 읽으면 원본 파일을 스택에 유지하면서 여러 번 발생할 수 있으며 새 파일이 EOF이면 스택의 이전 파일을 다시 팝해야합니다. 내 코드에서입력 스트림 스택 읽기 및 유지

std::ifstream* currentStream = fileStream; 
    // this is within a class where I pass through fileStream in its initialization 
    stack<std::ifstream*> fileStack = stack<std::ifstream*>(); 

    while(!fileStack.empty() || !currentStream->eof()){ 
     while (!currentStream->eof()) { 
     getline(*currentStream, lineBuf); 
     string line = trim(lineBuf); 
     if (line = blahblah) { 
      //do stuff 
     } 
     else if (words[0] == "file") { 
      auto params = extractParameters(line); 
      std::ifstream simpFileStream; 
      simpFileStream.open(params[1][0].substr(1, params[1][0].length()-2) + ".simp"); 
      currentStream->swap(simpFileStream); 
      fileStack.push(&simpFileStream); 
     } 
     if(!fileStack.empty() && currentStream->eof()){ 
      // what to do here? 
      fileStack.pop(); 
     } 
     } 
    } 

나는 몇 가지 방법을 시도했지만, 이것은 내가 마지막으로 저장 한 것을, 나는 기본적으로 내가 새로운 ifstream을 생성하고 현재를 교환하고 스택에 이전을 집어 넣으려고 시도하다 그것이 제대로 작동하는지 확실하지 않습니다.

if 문에서는 몇 가지 시도를했지만 아무 것도 작동하지 않아 문제가 발생합니다. 기본적으로 코드를 테스트 할 때 새 스트림을 열면 작동하고 새 파일을 읽기 시작하지만 오래된 ifstream으로 다시 팝하는 방법을 모르겠습니다. ou는 귀하의 의견에서 그것은 나에게 보인다

+1

당신은 인수로 파일 이름을 갖는 재귀 함수를 사용할 수 있습니다. 함수에서 파일을 열고 행을 읽습니다. 파일 이름을 읽을 때 파일 이름으로 함수를 호출하십시오. – Shiping

+0

거의 모든 일을 잘못하고 있습니다. 당신은'eof'를 루핑하고 있습니다. 범위를 벗어난 스트림의 주소를 스택으로 푸시합니다. 당신은 파일 스트림에서 옮겨온 재사용 중입니다 ... 프로그램이 무엇을해야하는지에 대해서는 매우 불분명하여 제안을하기가 어렵습니다. – Galik

+0

당신 말이 맞아요, 나는 변화를 가져 왔고 제대로 작동하게하기 위해 물건을 삭제했습니다. 내 진짜 질문은 나중에 다시 팝업으로 스택에 파일 스트림을 저장하는 방법이 있는지 여부입니다. –

답변

0

조금이 같은 구조 뭔가를 찾고 될 수있다

void method(std::string const& filename) 
{ 
    // use smart pointers to avoid memory leaks 
    std::stack<std::unique_ptr<std::ifstream>> files; 

    // open initial file and push it to the top of the stack 
    // to use as the 'current' file 
    files.push(std::make_unique<std::ifstream>(filename)); 

    // use the top() of the stack as your 'current' file stream 

    // as long as we have open files, keep going 
    while(!files.empty()) 
    { 
     // read the line in the loop control block 
     for(std::string line; std::getline(*files.top(), line);) 
     { 
      if(line == "some stuff") 
      { 
       // start a new file on the top of the stack 
       files.push(std::make_unique<std::ifstream>("new file name")); 
      } 
      else if(line == "some other stuff") 
      { 
       // do other stuff 
      } 
      // yet more stuff 
     } 

     // end of file reached here - pop 
     // delete the current file stream off the top 
     // of the stack (automatically closing the file) 
     files.pop(); 
     // Now the top of the stack contains the previous current file stream 
    } 
} 
+0

덕분에, 구조는 내가 찾고있는 것입니다. –