我正在研究一个程序,用户将文本写入编辑框,然后为他创建一个txt文件,其中包含他的文本。
如何从编辑框中保存他的文本?
我想使用它,因为我想将他的文本文件转换为二进制文件,但是我的程序无法将数据保存在他的txt文件中。
我可以再次使用GetWindowText
和GetWindowTextLength
函数,但是有一个问题,他可以从编辑框中删除文本。
程序的这一部分是从编辑框中获取文本,然后保存并创建一个txt文件。
void write_file(char* path)
{
FILE *file;
file = fopen(path, "w");
int _size = GetWindowTextLength(filechoosed);
char *data = new char[_size + 1];
if (file) {
GetWindowText(filechoosed, data, _size + 1);
fwrite(data, _size + 1, 1, file);
fclose(file);
}
return;
}
void save_file(HWND hWnd)
{
char file_name[100];
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = 100;
ofn.lpstrFilter = "txt File\0*.txt*\0";
ofn.nFilterIndex = 1;
GetSaveFileName(&ofn);
write_file(ofn.lpstrFile);
}
我想更改我的加密方式,我目前的方式只是将randomstring写入文件,但是之后没有办法解密文件,因此我想保存文本,然后对其进行加密和解密。
// Write & Save Encrypt File
void write_file_to_encrypt(char* path1)
{
string str = randomString();
FILE* file;
file = fopen(path1, "w");
if (file) {
fwrite(str.c_str(), sizeof(char), str.size(), file);
fclose(file);
}
return;
}
void save_file_to_encrypt(HWND hWnd1)
{
OPENFILENAME ofn;
char file_name[100];
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd1;
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = 100;
ofn.lpstrFilter = "All Files\0*.*\0";
ofn.nFilterIndex = 1;
GetSaveFileName(&ofn);
write_file_to_encrypt(ofn.lpstrFile);
}
// Decrypt
void write_file_to_decrypt(char* path2)
{
FILE* file;
file = fopen(path2, "w");
int _size = GetWindowTextLength(filechoosed);
char* data = new char[_size + 1];
string str = data;
if (file) {
GetWindowText(filechoosed, data, _size + 1);
fwrite(data, _size + 1, 1, file);
fclose(file);
}
return;
}
void save_file_to_decrypt(HWND hWnd2)
{
char file_name[100];
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd2;
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = 100;
ofn.lpstrFilter = "txt File\0*.txt*\0";
ofn.nFilterIndex = 1;
GetSaveFileName(&ofn);
write_file_to_decrypt(ofn.lpstrFile);
}
更新: 我创建了一个名为file_path的全局字符串变量,他的值是data,该数据是用户写入文件的数据,因此接下来,当我同时解密两个文件时,我使用此数据恢复文本,然后“解密”该文件。时间,第一个文件中的值将移至第二个文件。
因此,我检查是否创建了写入文件,清除了字符串,但该值仍在字符串中,问题是,如果我创建了一个名为“ first”且文本为“ myFirst”的txt文件,然后创建了一个文件用文本“ mySecond”调用“ second”,然后进行加密,当我想解密第一个然后解密第二个时,两个文本均是“ myFirst”,因此我想清除字符串并重新开始当用户写入文件时。
if (write_file) {
str.clear();
str = file_path;
}
FILE* file;
file = fopen(path2, "w");
if (file) {
fwrite(str.c_str(), sizeof(char) , str.size(), file);
fclose(file);
}
return;
那么,如何保存用户输入的文本,然后将其用于其他用途?
如果您听不懂||需要更多信息,请索取。
答案 0 :(得分:0)
您使用GetSaveFileName
保存了两次文件。
您可能想使用GetOpenFileName
打开一个先前保存的现有文件。
请注意,在Windows Vista及更高版本中,GetSaveFileName
和GetOpenFileName
均已弃用。
您还将两次以写模式打开文件。同样,您可能打算在写入模式("w"
标志)后跟write
打开文件。然后以读取模式("r"
标志)和read
再打开。
示例:
void encrypt(HWND hwnd)
{
char file_name[MAX_PATH] = { 0 };
OPENFILENAME ofn = { 0 };
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = file_name;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "All Files\0*.*\0";
if(!GetSaveFileName(&ofn))
return;
//get text from edit box
int size = GetWindowTextLength(filechoosed);
if(!size) return;
char* data = new char[size + 1];
GetWindowText(filechoosed, data, size + 1);
//write to file
FILE *file = fopen(file_name, "w");
fwrite(data, 1, size, file);
fclose(file);
delete[]data;
}
void decrypt(HWND hwnd)
{
char file_name[MAX_PATH] = { 0 };
OPENFILENAME ofn = { 0 };
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = file_name;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "All Files\0*.*\0";
if(!GetOpenFileName(&ofn))
return;
//read file
FILE *file = fopen(file_name, "r");
fseek(file, 0, SEEK_END);
int filesize = ftell(file);
rewind(file);
char *data = new char[filesize + 1];
fread(data, 1, filesize, file);
data[filesize] = '\0';
fclose(file);
SetWindowText(filechoosed, data);
delete[]data;
}
在C ++中,您应该使用std::fstream
而不是C风格的fopen
。
我不确定“加密”是什么意思。如果涉及任何加密,则还需要二进制模式,因此将为"wb"
和"rb"
。您必须使用系统的加密代码或外部库。
您应该通过删除所有Windows功能来简化示例。在继续使用Windows之前,请先掌握一些基本的C ++函数。这是一个更基本的示例。尝试制作一个控制台程序,并将MessageBox
替换为std::cout
void obfuscate(char *output, const char *input, int size)
{
//this is not encryption, it's for demo only
const char *key = "key";
int keysize = strlen(key);
for(int i = 0; i < size; i++)
output[i] = input[i] ^ key[i % keysize];
}
void create_encrypted_file(const char* filename)
{
FILE* file = fopen(filename, "wb");
if(!file)
{
MessageBoxA(0, "cannot create file, directory doesn't exits!", 0, 0);
return;
}
const char *input = "some random text";
int size = strlen(input) + 1;
char *output = new char[size];
obfuscate(output, input, size); //encrypt the content
fwrite(output, sizeof(char), size, file); //write data to encrypted file
fclose(file); //cleanup
delete[]output; //...
}
void decrypt_file(const char* filename)
{
FILE* file = fopen(filename, "rb");
if(!file)
{
MessageBoxA(0, "cannot file encrypted file", 0, 0);
return;
}
fseek(file, 0, SEEK_END); //get filesize
int size = ftell(file);
rewind(file);
char *input = new char[size];
char *output = new char[size];
fread(input, 1, size, file); //read file's content
obfuscate(output, input, size); //decrypt the content
MessageBoxA(0, output, "Decrypted:", 0);
fclose(file); //cleanup
delete[]input; //...
delete[]output; //...
}
用法:
int main()
{
const char *filename = "c:\\test\\test.txt";
create_encrypted_file(filename);
decrypt_file(filename);
return 0;
}
这将创建一个文本文件"c:\\test\\test.txt"
,其内容不可读(未加密)。但是可以使用解密功能进行查看。