我正在尝试制作一个简单的程序,将其值修改3(加密功能)->我希望它直接影响文件。但是我不确定如何。加密后,我将调用Decrypt函数(该函数完全按照我想要的方式工作),这样,您将必须运行程序以访问日记。无论如何,我可以像在解密功能中一样修改单个字符吗?我不断收到一条getline错误。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void decrypt_diary(string,string);
void encrpyt_diart(string,string);
int main()
{
string fileName = "Diary.txt";
string line;
decrypt_diary(fileName,line);
return 0;
}
void decrypt_diary(string fileName, string line)
{
ifstream journal;
journal.open(fileName);
if (journal.is_open())
{
while (getline(journal,line))
{
for (int i=0; i<signed(line.length()); i++)
{
line[i] = line[i] + 3;
}
cout << line << endl;
}
}
journal.close();
}
void encrypt_diary(string fileName, string line)
{
ofstream journal;
journal.open(fileName);
if (journal.is_open())
{
while (getline(journal,line))
{
for (int i=0; i<signed(line.length()); i++)
{
line[i] = line[i] - 3;
// journal << line[i];
}
cout << line << endl;
}
}
journal.close();
}
答案 0 :(得分:0)
这是您的意思是getline错误吗?
./ main.cpp:41:36:错误:没有匹配的函数可以调用“ getline(std :: ofstream&,std :: __ cxx11 :: string&)” 而(getline(journal,line)
如果是这样,我认为问题在于没有 getline()函数采用 ofstream 对象作为 getline()用于读取文件,而 ofstream(输出文件流)用于写入文件。在 decrypt_diary 函数中它可以正常工作,因为它需要一个 ifstream(输入文件流)。
如果您专注于首先实现解密或加密,则可以轻松解决编译问题。
您可以尝试注释掉 encrypt_diary(字符串文件名,字符串行)函数,然后尝试编译并再次运行该程序。
我想您会发现您的 decrypt_diary(字符串fileName,字符串行)功能正常。
答案 1 :(得分:0)
因此,如果我正确理解了您想要的内容,则希望逐个字符地浏览文件,然后将其替换为其他字符。我将再次指出,逐个字符并不是最好的主意,但是对块的修改应该足够简单。
#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
和{{1} },因为它们只是存储字节,无论这些字节是多少。
这种方法意味着我们会对文件进行大量操作,并且可能不是最快的。相反,您可以分块读取,这种修改非常简单,只需将字符替换为字符数组,一次读取一个以上的字节即可。但是,如果可能的话,一次读取整个文件可能是最简单的。
write
使用#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
会导致其解密。
我们在这里没有使用字符串,因为我们并不是真的需要它们,但是如果您更喜欢字符串而不是字符数组,则可以始终这样做。
这当然是一个非常简单的示例,您可以根据需要随意对其进行修改和使其复杂化。还要注意,这可能不是解决此类问题的唯一(也是最好的)方法。