Чтение / запись в файл, пропадают байты, возможно переполнение символа - PullRequest
2 голосов
/ 03 февраля 2012

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

У меня есть проблема, и я не могу решить ее в течение некоторого времени.

Вот что я хочу сделать:
Чтение байта из файла в вектор, изменение байтов и запись их обратно.

Вот что происходит:
Кажется, что все средства шифрования работают, но почему-то после нескольких из этих операций часть файла пропадает.

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

По моему мнению, это может быть какой-то проблемой арифметического переполненияне знаю о.

Кстати, я использую Qt SDK и среду Windows, на случай, если это поможет.

Вот фрагмент кода:

void crypt(string * password,string filename, int sign){
    vector<char> stack;
    ifstream is;
    is.open(filename.c_str());
    char c;
    for (int i = 0; !is.eof(); i++){
        is >> noskipws >> c;
        stack.push_back(c);
    }
    stack.pop_back();
    is.close();
    int code = 0;
    double x;
    char method = 0;
    int var;
    for (int i = 0; i < password->size(); i++)
        code += password->at(i);
    for (int i = 0; i < (stack.size()); i++){
        // some unrelated stuff skipped
        if (sign == 1)code += stack[i];
        stack[i] += var*method*sign;    //<----this might be the cause!
        if (sign == -1)code += stack[i];
        method = 0;
    }
    ofstream os;
    os.open(filename.c_str());
    for (int i = 0; i < stack.size(); i++){
        os << noskipws << stack[i];
    }
    os.flush();
    os.close();
}

Извините за беспорядок в кодеЯ вроде написал это для тестирования.

Любые идеи будут оценены.

1 Ответ

3 голосов
/ 03 февраля 2012

Вы открываете свои файлы в «текстовом» режиме, это может вызвать проблемы, тем более что ваши выходные символы наверняка окажутся за пределами диапазона печатаемых символов ASCII. Это может вызвать проблемы, как, например, в Windows: при попытке вывести значение 0xD (возврат каретки) библиотека преобразует его в 0xD, за которым следует 0XA (перевод строки).

Итак, попробуйте открыть ваши файлы в двоичном режиме, например:

os.open(filename.c_str(), ios::binary);
...