0

わかりましたので、単純なシーザー暗号を解読するプログラムを作成する「タスク」が与えられました。

すべてが正しく機能していますが、入力が約 29 文字で停止するだけです。非常に大きなファイルから読み取りを行っており、テキストは「独立宣言」文の途中で停止します。これを引き起こす可能性のあるアイデアはありますか?ここで何かを悪用し、悪用していると思います。頭に石を投げてください。もっと「学習」を使用できると確信しています。

編集:さらに調査すると、私の問題はループと sizeof(myarray) に関係していると思います

編集 2: コードを編集しましたが、「場所 0x002A4000 の読み取りアクセス違反」が原因で壊れます。

 for (int i = 0; i < myArray.length(); i++)
    {
        // pritns each occurance cout << char(i + 'a') << " has " << count_Array[i] <<" occuarnces"  <<endl;
        if (count_Array[i] > tester)
        {
            //finds largest 
            tester = count_Array[i];
            max_array_value = i;
        }
    }
    // print

Thanks for any tips :] 

code: 

   #include <iostream>
#include <string>
#include <cctype>
#include <fstream>
using namespace std;

int decipher(string myArray, string outputFileName);

int main ()
{ 
    string outputFileName;
    string inputFileName;
    ifstream inputFile;
    string reply;
    char myArray;
    string all_text = "";

    //getting input and output files
    cout << "Please input filename: ";
    getline(cin,inputFileName);
    cout <<"please enter output filename:";
    getline(cin,outputFileName);
    //opens file
    inputFile.open(inputFileName);

    if (!inputFile.is_open())
    {
        //file failed to open
        cout <<"unable to open input file." <<endl << "Press enter to continue...";
        getline(cin,reply);
        exit(1);
    }
    //read file into all_text
    while(inputFile.peek() != EOF)
    {
        inputFile.get(myArray);
            all_text+=myArray;

    }
    // prints out file cout <<all_text;
            inputFile.close();
            //send to decipher
            decipher(all_text, outputFileName);
    cout << "press enter to continue";
    getline(cin,reply);
    return 0;
}



int decipher(string myArray, string outputFileName)
{
    char default_alp[26] = {'a', 'b' ,'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
    int count_Array[26] = { 0 };
    int tester = count_Array[0];
    int max_array_value = 0;
    string my_Message;
    char temp;
    ofstream outputFile;
    //gets count of occurances
    for (int i = 0; i < myArray.length(); i++)
    {
        count_Array[tolower(myArray[i]) - 'a']++;
    }

    for (int i = 0; i < myArray.length(); i++)
    {
        // pritns each occurance cout << char(i + 'a') << " has " << count_Array[i] <<" occuarnces"  <<endl;
        if (count_Array[i] > tester)
        {
            //finds largest 
            tester = count_Array[i];
            max_array_value = i;

        }
    }
    // prints useful information cout << "Largest number of occurances " << default_alp[max_array_value] <<endl << "shift amount is: " << default_alp[max_array_value]-'e' <<endl;
    for (int i = 0; i < myArray.length(); i++)
    {
//prints out each letter    cout << myArray[i];
    }

    for (int i = 0; i < myArray.length; i++)
    {
        cout <<myArray.length();
        //shifts the text based on value in dec
        int shift = default_alp[max_array_value]-'e';
        temp = myArray[i];
        if (isalpha(temp))
        {
            if(tolower(myArray[i])-shift >= 97)
            {
                my_Message += tolower(myArray[i]) - shift;
            }
            else
            {
                my_Message += tolower(myArray[i]) + 26-shift;
            }
        }
        else
        {
                my_Message +=myArray[i];
        }
    }
    outputFile.open(outputFileName);
    outputFile << my_Message;
    return 0;
}
4

2 に答える 2

1

どのコンパイラを使用していますか。私にとっては、コンパイルされません。

//ファイルを開く inputFile.open(inputFileName);

//ファイルを開く必要があります inputFile.open(inputFileName.c_str());

http://www.cplusplus.com/reference/fstream/ifstream/open/

しかし、コンパイルすると、問題なく動作するようです。ファイル全体が読み取られます。

于 2013-03-11T06:23:36.733 に答える
1

ではdecipher、インスタンスsizeof(myArray)のサイズを示します。stringインスタンスには、文字列のstring実際の長さ、非常に小さな文字列用のスペース、および実際のデータへのポインタが含まれる場合がありますが、データ、つまり文字列自体は含まれません。

の代わりにsizeof(myArray)myArray.length()!

于 2013-03-11T06:43:16.650 に答える