2017-05-06 5 views
1
#include <fstream> 

int main() 
{ 
    // compress 

    std::ifstream inFile("test.input"); 
    std::ofstream outFile("test.compressed"); 
    char c; 

    while(inFile >> c) 
     outFile << c + 1; 

    // decompress 

    std::ifstream inFile2("test.compressed"); 
    std::ofstream outFile2("test.output"); 

    while(inFile2 >> c) 
     outFile2 << c - 1; 

    // close 

    inFile.close(); 
    outFile.close(); 
    inFile2.close(); 
    outFile2.close(); 

    return 0; 
} 

이것이 내 코드입니다. 아마도 내가 이해하지 못했던 무언가가있을 것입니다. 왜냐하면 저에게 test.inputtest.output과 동일해야하지만 그렇지 않습니다.파일을 열고 모든 문자를 수정 한 다음 역순으로 원래 파일을 출력하지 않습니다.

+0

열고하려고하는 경우 '파일에 당신은 이미'먼저 플러시로 처리 ofstream'이 ifstream'. 압축 해제와 관련된 것을 시작하기 전에'outFile.flush()'를 호출하십시오. – StoryTeller

+0

기본 운영체제와 파일 시스템이 모든 데이터를 사용자에게 출력할지 여부를 결정할 수 있습니다. 읽기를 위해 열 때까지 "test.compressed"첫 번째 임시 출력 파일. –

+0

더 나아가, 필요한 것보다 오랫동안 물건을 보관하지 마십시오. 압축 코드를 중괄호로 묶거나 (또는 ​​다른 함수로 이동) 압축 해제 코드에 대해 동일하게 수행하십시오. 또한 스트림 소멸자를 사용하여 파일을 닫을 수 있으므로 명시 적으로'close'를 호출 할 필요가 없습니다. – StoryTeller

답변

3

두 가지 문제가 있습니다. 먼저 int에서 char을 더하거나 뺄 때 결과는 int입니다. 그래서 계산 c + 1test.compressed (예를 들어, 'a'의 ASCII 코드가 97이다. 그것에 1를 추가 한 후 문자 '9''8'로 파일에 기록 될 것 98을 얻을 것이라고 그래서)에 숫자로 기록됩니다. 그런 다음이 문자에서 1을 빼고 분명히 동일한 출력을 다시 얻지 못합니다. 결과를 char으로 다시 캐스팅하면 해결할 수 있습니다.

두 번째 문제는 훨씬 더 원시적입니다. 플러시하기 전에 작성한 파일에서 읽으려고 시도하여 작성한 데이터의 일부 또는 전체가 누락 될 수 있습니다. 이것은 일반적으로 좋은 습관입니다 일단 당신이 그들과 함께 끝나면 파일을 닫아 해결할 수 있습니다.

모두 함께 넣어하려면

#include <fstream> 

int main() 
{ 
    // compress 

    std::ifstream inFile("test.input"); 
    std::ofstream outFile("test.compressed"); 
    char c; 

    while(inFile >> c) 
     outFile << (char)(c + 1); // Casting to char 

    // Close the files you're done with 
    inFile.close(); 
    outFile.close(); 

    // decompress 

    std::ifstream inFile2("test.compressed"); 
    std::ofstream outFile2("test.output"); 

    while(inFile2 >> c) 
     outFile2 << (char)(c - 1); // You need the cast here too 

    // Close the files you're done with 
    inFile2.close(); 
    outFile2.close(); 

    return 0; 
} 
+0

감사! 사실, 정수로 파일을 인쇄하는 것이 char로 간주 될 것이라고 생각했습니다. 그것은 여전히 ​​작동하지 않는 이유는 모르겠지만 : 첫 번째'while'과'std (')에서'std :: cout << (char) (c + 1) << ""; :: cout << (char) (c - 1) << ""; "두 번째 문자에는 동일한 문자가 표시되지 않습니다. – Jeremy

+0

공백에서'1'을 뺀 상태에서 '1'을 빼기 때문입니다. 파일을 읽을 때 공백을 건너 뛸 필요가 있습니다. – Mureinik

+0

그럼에도 불구하고'<< ""가 없어도 두 개의 'while'은 같은 것을 출력하지 않습니다. – Jeremy