수정 됨 : 여기 내 전체 컴파일 가능한 프로그램이 있습니다. 메뉴로 구동되지만, 내가 붙어있는 부분은 옵션 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;
}
누구든지 나를 도울 수 있습니까? –
outFile은 ofstream입니까? 그것은 어딘가에 폐쇄되어 있습니까? 그걸 쓰려고 할 때. 괜찮은거야? – dbrank0
예 outFile은 ofstream이며 아니요, 관련 코드 만 게시했습니다. 폐쇄되거나 열리는 유일한 시간은 게시했습니다. 나는 이미 fail()과 good()을 테스트했으며 아무 에러도 나타나지 않았다. –