1

「stackoverflowで答えが見つからない」のではなく、「自分が何を間違っているのか分からない」のように、大きな違いです!

とにかく、コードは以下に添付されています。それが行うことはかなり基本的なもので、ユーザーが作成したテキスト ファイルを取り込み、暗号化されたものを吐き出します。この場合、ユーザーは、実際の各文字の間にいくつのジャンク文字を配置するかを指定します。(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;

while ループの先頭に貼り付けたのは宣言変数です。これは、暗号化するだけでなく、復号化も行う非常に大きなコードの一部です。完全に機能するため、復号化の部分は省略しました。この部分です。に問題があります。

助けてくれてありがとう!

編集::私はVisual C++ Express 2008を使用していますが、エラーも警告もまったくないことがわかります。

重要な編集 ファイルに出力されていることがわかりました!ただし、ASCII文字ではなく数字を出力しており、本来あるべき文字の文字化けも出力しています。「infile.get(letter)」に戻ると、新しい文字が取得されません。したがって、現在、問題は2つあるようです。1)ASCII文字の代わりに数字を印刷します。2) 実際のキャラクターの代わりにガベージを使用する。

Question Answered 「重要な編集」の 2 番目の部分を見つけました ...何かに test.txt という名前を付けるとわかります...これは、C++ プログラムに入力すると、実際には test.txt.txt と呼ばれることを意味します。どんなプログラムでもうんざりさせるのは、ごくわずかで単純な詳細であることがわかります。ジョージ・ショアに感謝します。入力ファイルが間違った場所にあるというあなたのコメントは、実際のアイテム名を試すというアイデアを与えてくれました。

回答を手伝ってくれた皆さん、ありがとうございました!

4

3 に答える 3

4

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

また:

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

画面へのゴミの原因のようです。「putchar」関数は、その文字の整数値を返しながら画面にエコーします。次に何が起こるかというと、文字ではなく数値がファイルに出力されます。

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

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

必要に応じてコードを実行できるようにする必要があります。

于 2009-03-08T04:26:56.990 に答える
3

これを行うのではなく:

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

これを行う:

while (infile.get(letter))
{

これは、ファイルを読み取るための標準的なパターンです。
文字を取得し、結果の infile (get によって返される) を bool に変換して、まだ有効かどうかを確認します。

この線:

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

おそらく次のようになります。

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

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

于 2009-03-08T04:08:58.030 に答える
0

「 」の使用はy必要ですか? 私には紛らわしく、不必要に思えます。これを実装する場合は、' x' と ' z' だけを使用することを期待します。

while (!infile.eof())' ' 条件についてもよくわかりません。Pascal は前もって EOF を決定しますが、C++ は文字を読み取ろうとした後にしか EOF について通知できません。ただし、これはファイルの最後にのみ影響し、ループの本体には影響しません。

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

(コンパイルされていないコード!)。

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

于 2009-03-08T03:44:19.680 に答える