C запись в текстовый файл повреждена

#c #memory-management #vector

#c #управление памятью #вектор

Вопрос:

У меня есть этот код, который шифрует данные в соответствии с этим [pdf].1 Проблема, с которой я сталкиваюсь, заключается в том, что код выдает правильный вывод. когда я «кошу» выходной файл, я получаю правильный ответ, однако, если я открываю файл в текстовом редакторе, я получаю результаты, которые выглядят следующим образом:

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

использование этой строки в качестве исходного аргумента и ключей: CORNFLAKES и BLACKHORSE

Отправить сообщение на bridgebythechurchxxammoneedededurgentlywithmagazinesxxx

это проблема с памятью, сбой моего потока? Я чувствую, что упускаю из виду что-то, чего просто не вижу.

вот как он шифрует:

 string encrypt(string amp;key, string amp;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("%sn", 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 == ''){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 SORTn");
    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%sn", result.c_str());
    return resu<
}
  

Вот как я записываю в файл:

 string file = "";
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 filen";
    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 filen";
  

Вот ссылка на код

Комментарии:

1. Как вы ожидаете, что результат будет?

2. вывод должен быть таким, используя ключи: CORNFLAKES и BLACKHORSE hntrdrzsuxeiyeagyhoepdmbdecxtreehahupxxxbtienrmeglscwhdnosmntytelguxiea это то же самое, что и в pdf.

3. я должен упомянуть, что метод encrypt вызывается дважды и передает результаты из одной строки в следующий вызов

4. можете ли вы добавить ожидаемый результат к вашему вопросу с соответствующими разрывами строк?

5. Похоже, проблема в вашем текстовом редакторе. Какой из них вы используете, и есть ли у вас такая же проблема, если вы попробуете другой?

Ответ №1:

Вы начинаете с

 vector<char>(2)
  

в качестве элементов по умолчанию в matrix , а затем push_back() в них. В конце вы отбрасываете первый с

 for (int r= 1; r < matrix[0].size(); r  )
  

но это все равно оставляет вас с нулевым байтом. Вероятно, вы захотите начать с пустого вектора и использовать все его элементы.

Комментарии:

1. итак, мне нужен 2-мерный вектор, и первая строка предназначена для ключевого слова, затем я начинаю переходить к следующей строке в другом векторе. этот цикл for используется только для захвата элементов вектора и помещения их в строку в качестве проверки, чтобы убедиться в правильности содержимого. Достаточно интересно, что когда я меняю пустой вектор, я получаю segfault: 11.

2. @jcjunction: этот ответ правильный. Нулевые байты распространяются в выходной файл, где они сбивают с толку текстовые редакторы. Я не могу разобрать ваш комментарий, но вы небрежны с этими векторами.

3. тогда, наверное, я перепутал свой код. что это значит тогда: вектор<вектор<символ> > матрица (key.length(), вектор<символ>(2));

4. Он создает (внешний) вектор и передает размер и другой (внутренний) вектор конструктору. Первый аргумент — это количество элементов, второй — их значение. Попробуйте найти эту информацию (в конце концов, это касается стандартного типа!) в Интернете. Это важный навык, который вам снова понадобится в будущем.