有没有保存用户输入文本的方法?

时间:2019-12-02 16:54:41

标签: c++ windows

我正在研究一个程序,用户将文本写入编辑框,然后为他创建一个txt文件,其中包含他的文本。

如何从编辑框中保存他的文本?

我想使用它,因为我想将他的文本文件转换为二进制文件,但是我的程序无法将数据保存在他的txt文件中。

我可以再次使用GetWindowTextGetWindowTextLength函数,但是有一个问题,他可以从编辑框中删除文本。

程序的这一部分是从编辑框中获取文本,然后保存并创建一个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;

那么,如何保存用户输入的文本,然后将其用于其他用途?

如果您听不懂||需要更多信息,请索取。

1 个答案:

答案 0 :(得分:0)

您使用GetSaveFileName保存了两次文件。

您可能想使用GetOpenFileName打开一个先前保存的现有文件。

请注意,在Windows Vista及更高版本中,GetSaveFileNameGetOpenFileName均已弃用。

您还将两次以写模式打开文件。同样,您可能打算在写入模式("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",其内容不可读(未加密)。但是可以使用解密功能进行查看。