2011-03-30 3 views
0

하나의 작업으로 읽기/쓰기를 위해 txt 파일을 열려고합니다. 내 이전 대상 배열에 저장된 사람에 의해 일부 문자를 교환하는 것입니다하나의 작업에서 C++ 읽기/쓰기 txt 파일 -> 문자 교환

void Inputfile::decryptFile(string filename) 
{ 
    for(int i=0;i<15;i++) 
    { 
     fstream filedest(filename.c_str(), ios::in | ios::out); 
     if(!filedest) 
      cerr << "Konnte Zieldatei nicht oeffnen!\n"; 
     else 
      cout << endl << filename << " geoeffnet zum entschluesseln!\n"; 

     while(!filedest.eof()) 
     { 
      filedest.get(ch); 
      if(ch == char(this->mostcharsencrypted[i])) 
      { 
       filedest.put(char(this->mostchars[i])); 
      } 

     } 
     filedest.close(); 
     cout << "Fertig!"; 
    } 
} 

[] 및 mostchars은 [] 문자를 개최 정수 배열입니다 mostcharsencrypted. 8 비트의 Ansii Value가 있다고 확신합니다.이 메서드가 호출되기 전에도이를 확인합니다.

그래서 현재 읽은 문자가 현재 배열 위치 (i : 0-14)에있는 문자 인 경우 txt 파일의 문자를 mostchars []의 문자와 교환하려고합니다.

현재 정확히 일치하는 유형이 표시되지만 txt 파일은 여전히 ​​동일한 콘텐츠를 표시합니다.

+2

'동안'[거의 항상 잘못] (HTTP입니다 (stream.eof()!) //www.parashift.com/c++-faq-lite/input-output.html#faq-15.5). 누가이 쓰레기를 가르쳐?! –

+0

btw'char'에 대한 명시 적 캐스트가 필요하지 않을 수 있습니다. –

+1

현실 세계에서 이것을하는 가장 좋은 방법은 파일을 메모리 맵핑하는 것입니다. 그러나 이것은 학습 예제처럼 보입니다. –

답변

0

파일을 대체 할 때 일반적으로 두 개의 개별 스트림이 입력에 사용되고 은 개별적으로 출력됩니다. 당신이 입력과 출력 모두를위한 하나 개의 스트림을 사용해야하는 경우 이 while 루프처럼 될 것입니다 다음

while(filedest) 
{ 
    streampos p = filedest.tellg(); 
    if(!filedest.get(ch)) break; 
    filedest.seekp(p); 
    char ch2 = (ch == char(this->mostcharsencrypted[i])) ? 
     char(this->mostchars[i]) : ch; 
    filedest.put(ch2); 
    filedest.sync(); 
} 
+0

내 파일에서 끝나는 endlees 루프가 발생합니다. TLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL ... 없음 및 모든 내용이 한 줄로 표시됩니다. – Stefan

+0

죄송합니다. 지금은 이유를 생각할 수 없습니다. 위의 코드는 테스트 할 때 MSVC2005 및 MinGW g ++ 3.4.5 에서 작동합니다. –

+0

Visual Studi 2010에서 테스트 해 보았습니다. 나중에 gcc 4.4에 관한 내용이있을 수 있습니다. 하지만 나는 임시 파일과 분리 된 입출력 스트림을 가지고 일하고있다. 어쨌든, 당신의 코드 중 일부는 나에게 몇 가지 힌트와 생각을 주었다 :) – Stefan

관련 문제