2009-03-08 8 views
1

「stackoverflowで答えが見つかりません」ではなく、「間違っていることを見ることができません」という大きな違いがあります。C++で見つからないファイルへの出力でエラーが発生しました

コードは以下のとおりです。それはかなり基本的なもので、ユーザーが作成したテキストファイルを取り込み、暗号化されたテキストファイルを吐き出します。この場合、ユーザは実際の文字の間にいくつの迷惑文字を置くかを指示します。 (IE:「Hello」という単語を1つのジャンク文字で暗号化したい場合は、「9H(eal〜lo)」のようになります。

私の問題は何らかの理由で入力ファイル私は前回の解読時と同じ設定を使ってファイルを読み込みましたが、今度はガベージ文字を読み込みますが、ファイルに出力するように指示すると、代わりに画面に出力されます!それは私が、正しく私のためにポイントを何かをやった意味ので何も、それが作成されているものの(出力ファイルに入れされていないように思える

コード:

string start; 
char choice; 
char letter; 
int x; 
int y; 
int z; 
char c; 
string filename; 

while(start == "enc") 
{ 
    x = 1; 
    y = 1; 
    cout << "How many garbage characters would you like between each correct character?: " ; 
    cin >> z; 
    cout << endl << "Please insert the name of the document you wish to encrypt, make sure you enter the name, and the file type (ie: filename.txt): " ; 
    cin >> filename; 
    ifstream infile(filename.c_str()); 
    ofstream outfile("encrypted.txt", ios::out); 

    while(!infile.eof()) 
    { 
     infile.get(letter); 
     while ((x - y) != z)   
     { 
      outfile << putchar(33 + rand() % 94); 
      x++;  
     } 
     while((x - y) == z) 
     { 
      outfile << letter; 
      y = 1; 
      x = 1; 
     } 
    } 
    outfile.close(); 
    cout << endl << "Encryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl; 
    infile.close(); 
    cout << "Do you wish to try again? Please press y then enter if yes (case sensitive)."; 
    cin >> choice; 

W帽子私はwhileループの先頭に貼り付けられた宣言変数ですが、これは暗号化だけでなく復号化もする大規模なコードの一部です。完全に動作するので解読部分を残しました。に問題があります。

ありがとうございました!

EDIT ::私はvisual C++ express 2008を使用しています。エラーはまったくなく、警告も出ません。

重要な編集 ファイルに出力中です!しかし、アスキー文字の代わりに数字を出力しています。また、その文字のためにガベージ文字を出力しています。 "infile.get(letter)"に戻ると、新しい文字は得られません。だから今は2倍の問題があるようです: 1)アスキー文字の代わりに数字を印字する。 2)実際のキャラクターの代わりにゴミを使用すると、それが得られるはずです。あなたが入力したときに、それが実際にtest.txt.txtと呼ばれる意味test.txtという...何かに名前を付けるならば、それが判明...「重要な編集」の第二部を発見 を回答

質問それをC++プログラムに組み込みます。ちょうどそれが、どんなプログラムもpooeyになる小さな、分、単純な詳細であることを示すために行く。 George Shoreにありがとうございます。間違った場所にある入力ファイルについてのあなたのコメントは、私に実際のアイテム名を試してみるというものです。

答えに協力いただいた皆様、ありがとうございます!

答えて

4

以前の回答に加えて、暗号化したいファイルが元のコードで見つからないためです。 IDEからコードを実行していると想定するのは安全ですか?その場合、暗号化されるファイルは、ソースと同じディレクトリになければなりません。また

outfile << putchar(33 + rand() % 94); 

は、画面にあなたのごみの発生源であると思われます。 'putchar'関数は、その文字の整数値を返す間に画面にエコーする。それでは、キャラクターとは対照的に、数字がファイルに出力されます。あなたはそれがしたいように実行するコードを有効にする必要があり

while ((x - y) != z)   
{ 
    c = (33 + rand() % 94); 
    outfile << c; 
    x++; 
} 

のようなものにそのブロックを変更します。

+0

(自分自身や他人を混同しないように、一度に1つの部分を実行する)私は 'test.txt'ファイルをソースと同じディレクトリに置いて、実際に手で暗号化して保存しました同じファイルを作成し、コードの解読部分でテストしたので、正しい場所にあります。 – Jeff

+0

あなたが投稿したときにコードを試みましたが、それは実際に数字を印刷していませんが、コンピュータが文字を読み取ることができないときに通常見えるブロック記号を印刷しています。私はcharとしてchar型を保つべきだと思いますか?私が理解していることを確認するだけです。 – Jeff

+0

確かに 'c'はまだcharでなければなりません。あなたが使用しているテキストファイルは、ASCIIエンコードされたファイルか、UTF8などのファイルですか?あなたのコードを逐語的に使って行ったすべてのテストは正しく動作しています。私は今私を混乱させています... –

0

'y'の使用は必要ですか?それは私にとっては混乱して不必要に思える。これを実装していた場合は、「x」と「z」だけを使用します。

while (!infile.eof())」の条件についてもわかりません。パスカルはEOFを前もって決定していますが、C++はread a characterを試した後でEOFについてしか教えてくれません。ただし、これはファイルの最後にのみ影響を与え、ループの本体には影響しません。

while (!infile.eof()) 
    { 
     infile.get(letter); 
     if (infile.good()) 
     { 
      for (int i = 0; i < z; i++)   
       outfile << putchar(33 + rand() % 94); 
      outfile << letter; 
     } 
    } 

(未コンパイルコード!)。

また、セキュリティのためにこれを使用しないでください。少しは役に立ちますが、確かに決定された人の情報を隠すことはありません。

+0

実際のキャラクターやガベージ・キャラクターを配置する必要があるかどうかを判断する方法は他にありませんでしたが、それは私には意味があり、それが重要でした。しかし、私の問題は、infileで読んでいないとoutfileは書いていない、あなたの入力のためにありがとう:)常に感謝! – Jeff

+0

私の最初のC++クラスは、私が教えている限り(そして私が読んだところで)、ファイルが終了するまですべてのステートメントを実行する必要があります。 – Jeff

+0

確かに、四半期の終わり(8週ぐらい)まで宿題を割当てるのに使われているのですが、コーディングが楽しくて今はやりたいと思っていましたが、問題を理解できませんでした。だから、これはファイルに出力され、私が書いたことは何ですか? – Jeff

3

よりもむしろこれをやって:

while (infile.get(letter)) 
{ 

これは、ファイルを読み込むための標準的なパターンです:

while (!infile.eof()) 
{ 
    infile.get(letter); 
    if (infile.good()) 
    { 

はこれを行います。
これは文字を取得し、結果として得られるinfile(getによって返される)は、boolに変換することによってまだ有効かどうかを確認するためにチェックされます。

ライン:

outfile << putchar(33 + rand() % 94); 

はおそらくあるべき:

outfile << static_cast<char>(33 + rant() % 94); 

のputchar()は標準出力に出力します。しかし、戻り値(入力と同じ)が出力ファイルに送られます。これを止めるには、値をcharに変換してoutfileに送信します。

+0

これはループ全体をスキップして何もしません...どうしたらうまくいくのですか? – Jeff

+0

私はそのテストを行うためには、より滑らかな方法が必要だと思った!質問者は、自分のコードに何が間違っているかを知っておく必要があることを断言しています。 –

+0

Jeff:whileループがスキップすると、infileが悪いことを意味します。これが最初の読み取りであるため、おそらくファイルが見つからなかったことを示唆しています。 –

関連する問題