Судя по всему, шифрование здесь почти не имеет ничего общего (или, по крайней мере, с проблемой).
while(!fin.eof() && znak != ' ')
Цикл вида while (!whatever.eof())
в значительной степени гарантированноработать некорректно.
fin.get(buffer, sizeof(buffer));
Когда вы делаете это, обратите внимание, что не гарантирует, что он будет читать sizeof(buffer)
символов - только то, что он не будет читать больше чем это.Обычно вы получаете меньше в конце файла, когда осталось не так много символов для чтения.[Редактировать: я должен также упомянуть, что вы можете читать меньше и в других местах - например, если вы читаете по сетевому соединению, довольно часто получают частичный буфер, но позже, когдаон прибывает.]
for(int i = 0; i < sizeof(buffer); i++)
Так что здесь, когда вы пытаетесь обработать sizeof(buffer)
символов, очень высоки шансы, что (особенно на последней итерации) вы пытаетесь обработать больше символов, чем вы на самом деле читали,Вы можете получить прочитанное число с помощью gcount
, хотя я не уверен, что действительно рекомендую его использовать.
Лично я, вероятно, сделаю что-то вроде этого:
class function {
char key;
public:
function(char k) : key(k) { }
char operator()(char input) { return key ^ input; }
};
int main() {
std::ifstream fin("a.txt");
std::ofstream fout("b.txt");
fin.noskipws();
std::transform(std::istream_iterator<char>(fin),
std::istream_iterator<char>(),
std::ostream_iterator<char>(fout),
function(key));
return 0;
}