2016-10-07 5 views
-2

すでに返信しているユーザーのおかげで!今、私はまだ出力ファイルにストリームを出力する際に​​問題があります。私はout_stream.put(ch)を使うべきだとは思わない。またはout_stream < < ch; 。ストリームを出力するためにここに何かがありません。これで、key_shiftの変更結果を出力ファイルに出力する場所をどのように修正できますか?

#include <iostream> 
#include <cstdlib> 
#include <fstream> 


using namespace std; 


void display_menu();  //Display the menu 
void get_files(ifstream& in_stream, ofstream& out_stream); 
void encrypt(ifstream &in_stream, ofstream &out_stream, int key_shift);  //Encrypts a file 
int get_num_1_through_10(int number); //Gets an integer numbered 1-10 and has the user re-enter integer if incorrrect 


int main() 
{ 
ifstream in_stream; //declaring the input file path 
ofstream out_stream; //delcaring the output file path 
string in_filename, out_filename; 

int option;   //Declaration of user "option" choice 
int key_shift;   //Declaration of user "shift key value" choice 
do     //Runs menu at least once 
{ 
    display_menu();   //function call 
    cin >> option;   //User inout for the option menu 
    switch(option) { 

     case 1:  cout << "Enter a value between 1 and 10 for the shift key value: ";   //Prompts the user to choose a "shift key value" between integers 1-10 
        cin >> key_shift;                 //User input for the "shift key value" 

        get_num_1_through_10(key_shift);             //Function call to get a number 1-10 

        cout << "You have chosen a shift key value of " << key_shift << endl;   //Prints to screen users "shift key value" choice 
        break; 

     case 2:  cout << "Time to get the files set up!\n"; 

        cout << "Beginning the encryption process...\n"; 

        encrypt(in_stream, out_stream, key_shift); 

        in_stream.close(); 
        out_stream.close(); 


        break; 

     case 3:  break; 

     case 4:  cout << "Goodbye" << endl;       //User chooses to quit the program 
        return 0; 

     default: cout << "Enter a choice 1-4" << endl;  //Alerts the user of incorrect input 
    } 

} while (option != 4); //While option is anything other than 1-4, quits 
return 0;     //Quits 
} 


void display_menu() { 
cout << "1) Set the shift key value" << endl; 
cout << "2) Encrypt a message" << endl; 
cout << "3) Decrypt a message" << endl; 
cout << "4) Quit" << endl; 
cout << "Type in an option and hit enter: "; 
} 

int get_num_1_through_10(int number) { 

if ((number > 0) && (number < 11)) {  //Excluding integers except integers 1-10 

    return number;       //If true, returns the users integer choice 
} 

else {              //If false, returns user back to menu function 
    cout << "Please input a number between 1 and 10\n";  //Reminds the user of incorrect integer input 
    return main();           //Returns to main function 
} 
} 


void encrypt(ifstream &in_stream, ofstream &out_stream, int key_shift) { 

ifstream in_filename; 
ofstream out_filename; 
get_files(in_filename, out_filename); 

char ch; 

do { 

(in_stream.get(ch)); 

    while (ch != '\n') { 
     ch = ch + key_shift; 
    out_stream.put(ch); 
    } 
} 
return; 
} 

void get_files(ifstream& in_stream, ofstream& out_stream) { 

string in_filename, out_filename; 
cout << "Enter the source file name: "; 
cin >> in_filename;       //User types in the file name to receive data 
cout << "Enter the destination file name: "; 
cin >> out_filename;      //User types in the file name to output the data to 

in_stream.open(in_filename.c_str());  //Opens the stream for input file 
out_stream.open(out_filename.c_str()); //Opens the stream for out file 

if (in_stream.fail() || out_stream.fail()) {  //If the input or output fail 
    cout << "Error opening input/output files\n"; //Alerts the user of failure 
    exit(1);          //Terminates 
} 

cout << "Files opening!" << endl; 
} 
+0

key_shiftキーは、ユーザーによって先に入力されます。 – Logan

+0

それから、コードのすべてを提供していないことはすでに分かっています。 [このwhile(!in_stream.eof())は途中で問題になる](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-間違っている)、問題でない場合。すべてのコードなしで確実にする方法はありません。 – user4581301

+0

待ってください。一度 'ch'を読むだけで、魔法のように変わるように動作します。うまく動かない。 – user4581301

答えて

0

問題1:

while (!in_stream.eof()) 

は、ファイルの末尾を越えて読み、それがファイルの最後にヒットだことをテストする前に、1本の余分読みを提供します。もっとここに: Why is iostream::eof inside a loop condition considered wrong?

ソリューション:

読む、その後、有効な読み出し(だけでなく、EOFのために多くの物事がうまくいかない可能性があるため)のためのテスト、および読み取りが有効であれば、その後、値の読み取りを使用します。

問題2:このループではどこにも

in_stream.get(ch); 
while (!in_stream.eof()) { 
    while (ch != '\n') { 
     ch = ch + key_shift; 
    out_stream << ch; 
    } 
} 

ch読み取りです。値が読み取られない場合、値は変更されず、EOFが決して読み取られないことがかなり確信で​​きます。

ソリューション:

ループでchをお読みください。

while (in_stream.get(ch)) { 

    while (ch != '\n') { 
     ch = ch + key_shift; 
     out_stream << ch; 
    } 
} 

よう

何かが1羽の鳥との両方の石を殺すべきです。 while (in_stream.get(ch))は、読み取りが成功した場合にループの本体にのみ入力し、テストします。

+0

情報ありがとうございます!私はそれを変更し、出力ファイルの名前を入力した後でプログラムがハングしているように見えるので、それをチェックしています。 – Logan

+0

開発環境に付属しているデバッガでプログラムを実行するとよいでしょう。プログラムがハングしてプログラムが強制的に中断されるのを待ってから、バックスクレーシスを調べてどこに止まっているのかを確認してください。 – user4581301

+0

ルージュ "!" ! – Logan

関連する問題