2013-08-06 1 views
1

이 질문에 이미 물었고 Google 기술이 실패한 경우 사전에 사과드립니다.C++ 파일의 줄 반복 방지

내가 잘 파일에 코드를 작성하지만 대한 수 있습니다 ... 나는 ncurses를 간단한 콘솔 게임을 만들고있어 나는 등 추가 지식, 보너스 자료,이 잠금 지퍼 폴더를 포함하고 싶었다 텍스트를 파일에 쓴 장소를 다시 방문 할 때 어떤 이유가 있더라도 반복됩니다. 나는 해결책을 찾고자 노력했지만, 이것이 최후의 수단이 될 수 없다.

기본 정보 : 저는 창을 사용하지만 프로그램을 크로스 플랫폼으로 만들고 싶습니다. 더 많은 정보가 필요하다면 기꺼이 제공 할 것입니다.

편집 1 :

std::ifstream checkFile("Unlocks.txt"); 
if(checkFile.is_open()) 
{ 
    std::string data; 
    std::string fernox = "Unlock for Fernox Piraxis File"; 
    while(std::getline(checkFile, data)) 
    { 
     if(data.find(fernox) == std::string::npos) 
     { 
      std::ofstream myFile("Unlocks.txt", std::ios::app); 
      myFile << "Unlock for Fernox Piraxis File: ZWdOFMRmeE\n"; 
      myFile.close(); 
      break; 
     } 
    } 
    checkFile.close(); 
} 

편집 2 : 나는 다른 파일의 어떤 부분을 덮어 시도하고 있지 않다. 이 코드는 위의 행이 이미 파일에 기록되어 있는지 확인하고 그렇지 않으면 씁니다. 그 줄이 파일 내에 이미 존재한다면, 나는 같은 줄을 다시 쓰고 싶지 않다. (그리고 나는 파일 안에 이미 덮어 쓰지 않도록 ios::app을 사용하고있다.)

도움을 위해 미리 감사드립니다. .

EDIT 3 :. 지금 twalberg 감사는 작업

최종 코드 :.

std::ifstream checkFile ("Unlocks.txt"); 
if(checkFile.is_open()) 
{ 
    bool found = false; 
    std::string data; 
    std::string fernox ("Unlock for Fernox Piraxis File"); 
    while(std::getline(checkFile, data)) 
    { 
     if(data.find(fernox) != std::string::npos) 
     { 
      found = true; 
      break; 
     } 
    } 
    if(!found) 
    { 
     std::ofstream myFile("Unlocks.txt", std::ios::app); 
     myFile << "Unlock for Fernox Piraxis File: ZWdOFMRmeE\n"; 
     myFile.close(); 
    } 
    checkFile.close(); 
} 
+0

루프가 checkFile''의 첫 줄을 읽습니다 당신이 필요로하는 것은 문자열을 추가할지 여부를 결정하는 경우에만 다음 파일의 각 라인을 확인하고, 구조보기 다음과 같습니다이다 'data' 문자열에서'fernox'를 검색 한 결과. 의도적이라고 생각하지 않습니다. 코드를 루프에 넣으면 꽤 무의미합니다. 이 문제가 당신이 묘사 한 문제와 관련이 있는지는 잘 모르겠지만, 나는 그것을 지적해야한다고 생각했습니다. –

+0

if 및 else 블록 모두에서 "CheckFile.close()"를 제거해야합니다. 어쨌든 실행될 것이므로 하나만 바깥쪽에 만 충분합니다;) –

+0

그래, if 및 else 문에서'checkFile.close()'를 제거했지만 도움이되지 않았고 문제는 도움말 메뉴라는 것입니다. 이야기를 읽으면 그 캐릭터의 바이오에 액세스하십시오. 이야기 섹션을 다시 읽고 읽으면 바이오에 대한 코드가 반복됩니다. 희망을 조금 지워 버립니다. – Piraxis

답변

1

현재 논리가 조금 떨어져 당신은 파일의 첫 번째 행을 읽고, 그리고 그 경우 선이 맞지 않으면 문자열을 잠시 멈추고 루프에서 빠져 나옵니다. 다음에 관계없이 그것을 닫고,

// open file 

bool found = false; 
while (std::getline(checkFile, data)) 
{ if (data.find(fernox) != std::string::npos) // we found a match 
    { found = true; 
    break; 
    } 
} 

if (!found) 
{ // append string here 
} 

// close file 
+0

테스트를 거쳐 작동합니다. 고맙습니다. 초보자로서 이러한 종류의 것들은 여전히 ​​내 이해 내에서 "완전히"있지 않으므로 다시 감사드립니다. – Piraxis