0

ファイルの入出力をいじって、エンコード/デコードプログラムを作成しようとしています。エンコードされた文字をファイルからプログラムに読み込んでデコードするのに助けが必要です。(これは課題ではありません。来年は9年生になるだけなので、やりがいがあるように思えたので、これをやろうとしています。)コードは次のとおりです。

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cstdlib>
/* 
 * OUT: categorize words into char's, assign a symbol/number to each char, output number 
 *      combonation to file.
    IN: load file, decode file, read decoded version. */ 

using namespace std;

void Encode(){
        char message[100];
    char ENCODED[100];
    cout<<"input new content:\n>";
    cin.getline(message, 99);
    cin.ignore();
    cout<<"encoding...\n";
    for (int i=0; i<100; ++i){
             if (message[i]=='a') ENCODED[i]='1';
        else if (message[i]=='b') ENCODED[i]='$';
        else if (message[i]=='c') ENCODED[i]='!';
        else if (message[i]=='d') ENCODED[i]='*';
        else if (message[i]=='e') ENCODED[i]='2';
        else if (message[i]=='f') ENCODED[i]='&';
        else if (message[i]=='g') ENCODED[i]='^';
        else if (message[i]=='h') ENCODED[i]='%';
        else if (message[i]=='i') ENCODED[i]='3';
        else if (message[i]=='j') ENCODED[i]='=';
        else if (message[i]=='k') ENCODED[i]='_';
        else if (message[i]=='l') ENCODED[i]='-';
        else if (message[i]=='m') ENCODED[i]='2';
        else if (message[i]=='n') ENCODED[i]='9';
        else if (message[i]=='o') ENCODED[i]='4';
        else if (message[i]=='p') ENCODED[i]='|';
        else if (message[i]=='q') ENCODED[i]='/';
        else if (message[i]=='r') ENCODED[i]='>';
        else if (message[i]=='s') ENCODED[i]='?';
        else if (message[i]=='t') ENCODED[i]='}';
        else if (message[i]=='u') ENCODED[i]='5';
        else if (message[i]=='v') ENCODED[i]=',';
        else if (message[i]=='w') ENCODED[i]='.';
        else if (message[i]=='x') ENCODED[i]=';';
        else if (message[i]=='y') ENCODED[i]=')';
        else if (message[i]=='z') ENCODED[i]='@';
        else if (message[i]==' ') ENCODED[i]='#';
                else if (message[i] =='\0') {ENCODED[i] = '\}'; break;}
        else ENCODED[i]=' ';
    }
    cout<<"done encoding.\n";
    cout<<"exporting file...\n";
    ofstream OUTfile ("encoded.txt");
    OUTfile<<ENCODED;
    cout<<"file exported to parent directory.\n"; 
    cin.get();
}

void Decode(){ //this is where I run into problems!!
        string encoded[100]
    char DECODED[100]
    ifstream INfile ("encoded.txt");
    cout<<"Decoding...\n";
    INfile>>encoded;
    for (i=0; i<100; ++i){
             if (encoded[i]=='1') DECODED[i]='a';
        else if (encoded[i]=='$') DECODED[i]='b';
        else if (encoded[i]=='!') DECODED[i]='c';
        else if (encoded[i]=='*') DECODED[i]='d';
        else if (encoded[i]=='2') DECODED[i]='e';
        else if (encoded[i]=='&') DECODED[i]='f';
        else if (encoded[i]=='^') DECODED[i]='g';
        else if (encoded[i]=='%') DECODED[i]='h';
        else if (encoded[i]=='3') DECODED[i]='i';
        else if (encoded[i]=='=') DECODED[i]='j';
        else if (encoded[i]=='_') DECODED[i]='k';
        else if (encoded[i]=='-') DECODED[i]='l';
        else if (encoded[i]=='2') DECODED[i]='m';
        else if (encoded[i]=='9') DECODED[i]='n';
        else if (encoded[i]=='4') DECODED[i]='o';
        else if (encoded[i]=='|') DECODED[i]='p';
        else if (encoded[i]=='/') DECODED[i]='q';
        else if (encoded[i]=='>') DECODED[i]='r';
        else if (encoded[i]=='?') DECODED[i]='s';
        else if (encoded[i]=='}') DECODED[i]='t';
        else if (encoded[i]=='5') DECODED[i]='u';
        else if (encoded[i]==',') DECODED[i]='v';
        else if (encoded[i]=='.') DECODED[i]='w';
        else if (encoded[i]==';') DECODED[i]='x';
        else if (encoded[i]==')') DECODED[i]='y';
        else if (encoded[i]=='@') DECODED[i]='z';
        else if (encoded[i]=='#') DECODED[i]=' ';
                else if (encoded[i] =='\0') {DECODED[i] = '\}'; break;}
        else DECODED[i]==' ';
    } 
    cout<<"Decoded file content: "<<DECODED;
    cin.get();
}


int main(){
    string choice;
    cout<<"Encode new message or decode previous file?\n> ";
    cin>>choice;
    cin.ignore();
    if (choice=="encode") Encode();
    if (choice=="decode") Decode();
    return 0;
}

ご覧のとおり、デコード機能に関しては、私が何をしているのかわかりません。どんな助けでもいただければ幸いです!ありがとうございました!

編集:提供された提案でコードを更新しましたが、コンパイラが「INfile>>encoded;」の行に到達したとき。「INfile>>encoded」の演算子「>>」に一致するものがないことを示しています...

4

3 に答える 3

1

ここでの問題は、charとstringの違いがわからないことだと思います。文字は、「a」「b」「c」「1」「0」「^」などの文字または記号です。ただし、文字列は、「abc」「123」「*」などの文字のシーケンスです。 &^"など。C/C ++では、文字を指定するために「a」のように一重引用符を使用します。一重引用符内の値は1文字しか含めることができません。文字列を指定するには、前述のように二重引用符を使用します。A二重引用符で囲まれた値には、必要な数の文字を含めることができます。

于 2012-08-01T01:15:04.003 に答える
1

問題:

コンパイルに失敗しました (g++-4.5.1)ifstreamコンストラクターの適切なオーバーロードが見つかりませんでした。必要name.c_str()です。

ifstream INfile (name);

次の 2 つの宣言にセミコロンがありません

char encoded[100]
char DECODED[100]

ループ カウンターiが宣言されていません ( for(int i = 0; ...)

for (i=0; i<100; ++i){
         if (encoded[i]=='1') DECODED[i]='a';

DECODED[i]ここから先は、文字定数を代入するのではなく、文字定数と比較します。DECODED[i]==これらすべてを に置き換えますDECODED[i] =

    else if (encoded[i]=='$') DECODED[i]=='b';
    else if (encoded[i]=='!') DECODED[i]=='c';
    else if (encoded[i]=='*') DECODED[i]=='d';

もう 1 つの問題は、実際のメッセージが短いかどうかに関係なく、100 文字をエンコードおよびデコードすることです。Decode()との両方でEncode()、文字列の末尾のチェックを追加します。

if (array[i] =='\0') {
    other_array[i] = '\}';
    break;
}

変換を終了します。

于 2012-08-01T01:51:11.910 に答える
0

これはあなた自身のための演習なので、これらのクレイジーな if ステートメントを避けるためにマッピングを作成することをお勧めします (そして、後でエンコーディングを変更しやすくします):

// Warning: always address these with ints or unsigned char, not char
// if you expect extended ASCII characters
static unsigned char encode_map[256] = {0};
static unsigned char decode_map[256] = {0};

void InitEncodingMap()
{
    encode_map['a'] = '1';
    encode_map['b'] = '$';
    encode_map['c'] = '!';
    encode_map['d'] = '1';
    // etc...
    encode_map['z'] = '@';
    encode_map[' '] = '#';

    // Create the reverse map
    for( int i = 0; i < 256; i++ ) {
        unsigned char encoded = encode_map[i];
        if( decode_map[encoded] != 0 ) {
            printf("Collision for mapping %c -> %c\n", (char)i, encoded );
        } else {
            decode_map[encode_map[i]] = (unsigned char)i;
        }
    }
}

次に、これらのマップを使用するように Encode 関数と Decode 関数を書き直してみてください。

于 2012-08-01T01:48:22.040 に答える