2012-02-07 2 views
2

수정 됨 : 여기 내 전체 컴파일 가능한 프로그램이 있습니다. 메뉴로 구동되지만, 내가 붙어있는 부분은 옵션 DECRYPT, 시저 암호화 된 파일 또는 숫자 5의 암호를 해독하는 것입니다 (초기 질문에 입력 할 수 있거나 암호 해독시 소문자, 대문자 또는 낙타가 될 수 있음). 케이스). ofstream 변수 outFile은 사용자가 명명 한 파일을 만듭니다 (존재하지 않는 파일이어야 함). 문제는 단지 빈 파일을 생성하고 그 안에 어떤 데이터도 인쇄하지 않는다는 것입니다. 모든 변수는 올바른 값을 저장합니다. cout은 작동하지만 outFile은 작동하지 않습니다. 내가 제대로하고 있지 않은 것이 있습니까? 나는 나쁜, 실패, 그리고 is_open 테스트하려고했는데 그들 중 누구도 어떤 문제가 있습니다. 나는 프로그램의 다른 옵션들이 파일을 만들고 쓰기 만하기 때문에 파일 권한이 아무 것도 막지 않을 것이라고 생각한다. 누구든지 나를 도울 수 있습니까?ofstream은 파일을 생성하지만 쓸 수는 없습니다

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cctype> 
#include <map> 
#include <iomanip> 
#include <vector> 
using namespace std; 
int main() { 
string inputFileName, outputFileName, inData, outData, inWord, outWord, trash; 
ifstream inFile, testStream; 
ofstream outFile; 
bool outPutOpened = false, isLowerCase = false; 
char outChar, inChar; 
int shiftNum = 0, idx = 0, total = 0, max = 0, shiftValue = 0; 
map<char,int> charMap; 
map<char,int>::iterator mapIt; 
vector<char> alphabet(26); 
vector<char>::iterator shiftIt; 
do { 
    inWord.clear(); 
    outWord.clear(); 
    cout << "Available options: " << endl; 
    cout << "1. ENCRYPT - Encrypt a file using Caesar Cypher" << endl 
     << "2. CHARFREQ - display character frequency table for file" 
     << endl << "3. Quit - Exit the program" << endl 
    << "5. DECRYPT - decrypt a cyphered file" << endl << endl; 
    cout << " Enter keyword or option index: "; 
    getline(cin, inWord); 
    outWord.resize(inWord.length()); 
    transform(inWord.begin(), inWord.end(), outWord.begin(), ::toupper); 
    if (outWord.compare("ENCRYPT") == 0 || outWord.compare("1") == 0) { 
     cout << "CAESAR CYPHER PROGRAM" << endl 
     << "======================" << endl << endl; 
     do {     
      cout << "Provide the input file name: "; 

      getline(cin, inputFileName); 

      inFile.open(inputFileName.c_str()); 
      if (inFile.fail()) { 
       cout << "Cannot open file, please try again!" << endl; 
       inFile.clear(); 
      } 
     } 
     while (!inFile.is_open()); 

     do { 
      cout << "Provide the output file name: "; 
      cin >> outputFileName; 
      getline(cin, trash);     
      testStream.clear(); 
      testStream.open(outputFileName.c_str()); 
      if(testStream.good()) { 
       cout << "That file already exists, choose another" << endl; 
       testStream.clear(); 
       testStream.close(); 
      } 
      else { 
       testStream.clear(); 
       testStream.close(); 
       outFile.open(outputFileName.c_str()); 
       if (outFile.good()) { 
        outPutOpened = true; 
       } 
      } 
     } 
     while (!outPutOpened); 
     cout << "Enter the shift number: "; 
     cin >> shiftNum; 
     getline(cin, trash); 
     while(getline(inFile, inData)) { 

     for (idx = 0; idx <= inData.length() - 1; idx++) { 
      if (inData[idx] >= 'a' && inData[idx] <= 'z') { 
       outChar = (((inData[idx] - 'a') + shiftNum) % 26) + 'a'; 
       outFile.put(outChar); 
      } 
      else if (inData[idx] >= 'A' && inData[idx] <= 'Z'){ 
       outChar = (((inData[idx] - 'A') + shiftNum) % 26) + 'A'; 
       outFile.put(outChar); 
      } 
      else { 
       outFile.put(inData[idx]); 
      } 
     } 
     } 
     inFile.clear(); 
     inFile.close(); 
     outFile.clear(); 
     outFile.close(); 
    } 
    else if (outWord.compare("2") == 0 || outWord.compare("CHARFREQ") == 0){ 
     cout << "Enter input file name: "; 
     getline(cin, inputFileName); 
     inFile.open(inputFileName.c_str()); 
     while (inFile.get(inChar)) { 
      if (charMap.find(inChar) == charMap.end()) { 
       charMap[inChar] = 1 ; 
      } 
      else { 
       ++charMap[inChar]; 
      } 
     } 
     cout << "Character Frequencies For \"" << inputFileName << "\"" 
      << endl; 
     for (mapIt = charMap.begin(); mapIt != charMap.end(); mapIt++) { 
      total += (*mapIt).second; 
     } 
     cout << "Total bytes read: " << total << endl; 
     for (mapIt = charMap.begin(); mapIt != charMap.end(); mapIt++) { 
      cout << " ('" << (*mapIt).first << "') occurs " 
      << (*mapIt).second << " times (" 
      << static_cast<double> ((*mapIt).second) 
      /static_cast<double> (total) << "% of all characters)" << endl; 
     } 
     inFile.clear(); 
     inFile.close(); 
    } 
    else if (outWord.compare("5") == 0|| outWord.compare("DECRYPT") == 0) { 
     outPutOpened = false; 
     do {     
      cout << "Provide the input file name: "; 

      getline(cin, inputFileName); 

      inFile.open(inputFileName.c_str()); 
      if (inFile.fail()) { 
       cout << "Cannot open file, please try again!" << endl; 
       inFile.clear(); 
      } 
     } 
     while (!inFile.is_open());   
     while (inFile.get(inChar)) { 
      if (inChar < 'a' || inChar > 'z') { 
       inFile.ignore(); 
      } 
      else { 
       inChar -= 'a'; 
       alphabet[static_cast<int> (inChar)]++; 
      } 
     } 
     for (idx = 0; idx < alphabet.size(); idx++) { 
      if(max < alphabet[idx]){ 
       max = alphabet[idx]; 
      } 
     } 
     shiftIt = find(alphabet.begin(), alphabet.end(), max); 

     shiftValue = (distance(alphabet.begin(), shiftIt) - 4); 
     if (shiftValue < 0) { 
      shiftValue += 26; 
     } 
     inFile.close(); 
     do {     
      inFile.open(inputFileName.c_str()); 
      if (inFile.fail()) { 
       cout << "Cannot open file, please try again!" << endl; 
       inFile.clear(); 
      } 
     } 
     while (!inFile.is_open()); 

     outPutOpened = false; 
     do { 
      cout << "Provide the output file name: "; 
      cin >> outputFileName; 
      getline(cin, trash);     
      testStream.clear(); 
      testStream.open(outputFileName.c_str()); 
      if(testStream.good()) { 
       cout << "That file already exists, choose another" << endl; 
       testStream.clear(); 
       testStream.close(); 
      } 
      else { 
       testStream.clear(); 
       testStream.close(); 
       outFile.open(outputFileName.c_str()); 
       if (!outFile.good()) { 
        cout << "bad output"<< endl; 
        outFile.clear(); 
       } 
       if (outFile.good()) { 
        outPutOpened = true; 
       } 
      } 
     } 
     while(!outPutOpened); 

     while((inFile.get(inChar))) { 

      if (inChar >= 'a' && inChar <= 'z') { 


       inChar -= shiftValue; 
       if (inChar < 'a') { 
        inChar += 26; 
       } 

      outFile << inChar; 
      } 
      else if (inChar >= 'A' && inChar <= 'Z'){ 
       inChar -= shiftValue; 
       if (inChar < 'A') { 
        inChar += 26; 
       } 
       outFile << inChar; 

      } 
      else { 
       outFile << inChar; 
      } 

     } 
    } 
    else if (outWord.compare("3") == 0 || outWord.compare("QUIT") == 0) { 
     break; 
    } 
    else { 
     cout << inWord << " is an unrecognized option, please try again" 
     << endl; 
    } 
} 
while (outWord.compare("3") || outWord.compare("QUIT")); 
return 0; 

}

+0

누구든지 나를 도울 수 있습니까? –

+1

outFile은 ofstream입니까? 그것은 어딘가에 폐쇄되어 있습니까? 그걸 쓰려고 할 때. 괜찮은거야? – dbrank0

+0

예 outFile은 ofstream이며 아니요, 관련 코드 만 게시했습니다. 폐쇄되거나 열리는 유일한 시간은 게시했습니다. 나는 이미 fail()과 good()을 테스트했으며 아무 에러도 나타나지 않았다. –

답변

4

당신은 문자가 실제로 파일에 기록하기 위해 스트림을 플러시해야합니다. ..

outFile.flush(); 

및 텍스트 파일에 잘 기록됩니다 : 당신의 쓰기 - 투 - OUTFILE-while 루프 후 은을한다.

+0

감사합니다! 그것으로 해결되었습니다. 전에 다른 곳에서 치우려고했는데 어디로 넣어야할지 몰랐습니다. –

+1

(다른 동료의 경우) 'std :: unitbuf'와 함께 자동 비우기 기능이 있습니다. – Offirmo

0

시도 outFile.close();. 그것은 나를 위해 일했습니다.

관련 문제