C ++写入文本文件已损坏

时间:2014-06-18 04:57:00

标签: c++ memory-management vector

我有这个代码根据[pdf]加密数据。1 我遇到的问题是代码产生正确的输出。当我“cat”输出文件时,我得到了正确的答案,但是如果我在文本编辑器中打开文件,我会得到如下结果:

0068 6e74 7264 727a 0073 7558 6569 7965
0061 6779 686f 6570 0064 6d62 6465 6358
0074 7265 6568 6168 0075 7058 5862 7469
0065 6e72 6d65 676c 0073 6377 6864 6e6f
0073 6d6e 7479 7465 006c 6775 5869 6561

预期输出为:

 hntrdrzsuXeiyeagyhoepdmbdecXtreehahupXXbtienrmeglscwhdnosmntytelguXiea

使用此字符串作为原始参数和Keys:CORNFLAKES和BLACKHORSE

sendresupplytothebridgebythechurchXXammoneededurgentlywithmagazinesXXX

这是一个内存问题,我的流失败了吗?我觉得我忽视了一些我看不到的东西。

这是加密的方式:

string encrypt(string &key, string &toEncrypt)
{
    int height= 1;
    string result = "";

    vector<vector<char> > matrix(key.length(), vector<char>(2));

    string::iterator it=toEncrypt.begin();

    for (int i = 0; i < key.length(); i++)
    {
        matrix[i][0] = key.at(i);
    }


    // put info into matrix
    printf("%s\n", key.c_str());
    while( it!=toEncrypt.end()) // while string still has more chars
    {
        //printf("newline----\n");
        for (int col = 0; col < key.length(); col++,it++)
        {
            if (it != toEncrypt.end())
            {
                if(*it == '\0'){it++;}
                matrix[col].push_back(*it);
                printf("%c", *it);
                continue;
            }
                if(col < key.length())  
                    matrix[col].push_back('X');
                printf("%c", 'X');

        }
        height++;
        printf("\n");
    }
    //parse trough the matrix
    printf("\n");
    BubbleSort(matrix);
    printf("\n");

    printf("PAST BUBBLE SORT\n");
    for (int c = 0; c < key.length(); c++)
    {
        for (int r= 1; r < matrix[0].size(); r++)
        {
            result += matrix[c][r];
            printf("%c",matrix[c][r]);
        }
        printf("\n");
    }


    printf("THE RESULT IS%s\n", result.c_str());
    return result;
}

这就是我写文件的方式:

string file = "\0";
printf("Please Enter the name of the file that contains the text to be encrypted with the extention.\n");
getline(cin, file, '\n');

string line;
string encrypted;

transposition_encr encryptor = transposition_encr(k1,k2);

ifstream myfile (file.c_str());
if (myfile.is_open())
{
    while ( getline (myfile,line) )
    {
         encrypted += line; 
    }

    myfile.close();

}
else 
{
    cout << "Unable to open file\n";
    return -1; 
}

cout << encrypted << endl;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

cout<< encrypted << endl;
encrypted = encryptor.encryption(line);
cout<< encrypted << endl;

string str = "outputfile-encrypted-str.txt";
ofstream myfile2(str.c_str());
  if (myfile2.is_open())
  {
   myfile2 << encrypted;
   myfile2.close();
  }
   // else cout << "Unable to open file\n";

以下是代码<{3}}

1 个答案:

答案 0 :(得分:2)

你从

开始
vector<char>(2)

作为matrix中的默认元素,然后push_back()作为默认元素。最后,你用

丢弃第一个
for (int r= 1; r < matrix[0].size(); r++)

但仍留有空字节。您可能希望从空向量开始并使用其所有元素。