Так что, если я правильно понимаю, что вы хотите, вы хотите просмотреть файл, символ за символом и заменить его другим символом.Я снова скажу, что переход от символа к символу, вероятно, не лучшая идея, но модификация кусков должна быть достаточно простой.
#include <string>
#include <fstream>
#include <iostream>
inline void encrypt_char(char& in) {
in += 3;
}
inline void decrypt_char(char& in) {
in -= 3;
}
int main(int argc, char** argv) {
//These first 2 lines just process the command line argument
if (argc < 2 || (argv[1][0] != 'e' && argv[1][0] != 'd') || argv[1][1] != '\0') return 1;
bool encrypt_mode = (argv[1][0] == 'e' ? true : false);
std::fstream file("Diary.txt", std::ios::in | std::ios::out);
file.seekg(0, std::ios::end);
size_t size = file.tellg(); //This should tell us the file size
char c;
for (size_t i = 0; i < size; i++) {
file.seekg(i, std::ios::beg); //Set read position
file.read(&c, 1); //Read a character
if (encrypt_mode) encrypt_char(c);
else decrypt_char(c);
file.seekp(i, std::ios::beg); //Set write position
file.write(&c, 1); //Write a character
}
file.close();
return 0;
}
Обратите внимание, что мы избегаем использования >>
и <<
по мере их форматирования, пропускаем пробелы по умолчанию (хотя вы можете это изменить) и т. Д. Вместо этого мы используем read
и write
, так какони просто хранят байты, какими бы они ни были.
Этот подход означает, что мы выполняем множество операций над файлом и, вероятно, не самый быстрый.Вместо этого вы можете прочитать в блоках, что изменение довольно просто, просто замените символ массивом символов и прочитайте больше чем 1 байт за один раз.Однако, если это возможно, проще всего прочитать весь файл за один раз.
#include <string>
#include <fstream>
#include <iostream>
inline void encrypt_char(char& in) {
in += 3;
}
inline void decrypt_char(char& in) {
in -= 3;
}
int main(int argc, char** argv) {
//These first 2 lines just process the command line argument
if (argc < 2 || (argv[1][0] != 'e' && argv[1][0] != 'd') || argv[1][1] != '\0') return 1;
bool encrypt_mode = (argv[1][0] == 'e' ? true : false);
std::fstream file("Diary.txt", std::ios::in | std::ios::out);
file.seekg(0, std::ios::end);
size_t size = file.tellg(); //This should tell us the file size
file.seekg(0, std::ios::beg);
char* fileData = new char[size]; //Don't need null-termination
file.read(fileData, size); //Read the whole file
for (size_t i = 0; i < size; i++) { //Process the characters
if (encrypt_mode) encrypt_char(fileData[i]);
else decrypt_char(fileData[i]);
}
file.seekp(0, std::ios::beg); //Find the start of the file
file.write(fileData, size); //Write the whole thing
delete[] fileData;
file.close();
return 0;
}
Вызов программы с ./myProgram e
вызывает ее шифрование, а замена e
на d
вызывает ее дешифрование.
Мы не использовали здесь строки, поскольку они нам на самом деле не нужны, но вы всегда можете сделать это, если предпочитаете строки массивам символов.
Это, конечно, довольно простой пример, вы можете изменять и усложнять его по своему желанию.Также обратите внимание, что это, вероятно, не единственный (и, возможно, не самый лучший) способ решения таких проблем.