Шифратор\дешифратор
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Здравствуйте! Захотелось мне как то написать программу, шифрующую файлы. Пишу код:
программа компилируется и запускается нормально. Но вот работает не очень. В выходном файле всегда в конец добавляется «x», что, минимум, нежелательно.
Пытался исправить такой конструкцией:
но теперь в конец добавляется ещё и «я». Есть у вас какие-нибудь мысли по поводу этой ошибки?
P.S.: Вопрос в догонку, раз у создал тему на форуме. Каким образом получается совмещать флаги с помощью
|
при задании режимов открытия фалов( то же самое у функции MessageBox из Win32Api )?Что бы избавиться от бага, основной цикл твоей программы может выглядеть так:
...или так:
...но лучше всего так:
Дело в том, что метод
eof()
не проверяет файл на окончание, а просто констатирует факт, что конец файла уже достигнут. А само обнаружение конца файла происходит при операции чтения, т.е. при вызове методаread()
. Поэтому последний считанный символ, при чтении которого установился флаг конца файла, надо обрабатывать как символ конца файла (в данном случае его надо игнорировать).В последнем варианте кода используется тот факт, что метод
read()
возвращает this*, т.е. сам поток. А поток в контексте логического выражения преобразуется в true, если с потоком всё в порядке, и в false** в противном случае (в т.ч. и при EOF). Следовательно при достижении конца файла, считанный символ уже не попадёт в тело цикла.Чисто технически не понравились два момента. Первый:
для выходного файла флаг
ios::in
явно лишний.Второй:
Я бы всё-таки обозначил размер буфера через именованную константу. Вдруг потом захочется читать не по одному символу?
В логике программы не понравилась организация открытия/закрытия файлов. Например, если входной файл не существует, то всё равно будет запрошено имя выходного файла и, мало того, выходной файл будет создан. Пусть и нулевой длины. Попробуй сам исправить логику работы программы.
—
Оператор
|
— это оператор побитового ИЛИ. Читай в книжке про битовые операции. Короткое описание есть в Википедии.Спасибо, Череп!