是否可以保存用户输入的文本?

问题描述 投票:1回答:1

我正在开发一个程序,用户将文本写入编辑框,然后为他创建一个包含文本的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);
}

我想改变我的加密方式,我目前的方式只是向文件中写入随机字符串,但是之后没有办法解密文件,因此我想保存文本,然后对其进行加密和解密。

// 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文件,然后创建了一个名为“ second”的文本为“ mySecond”,然后进行加密,当我要解密第一个然后的第二个文本时,它们两个的文本均为“ 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;

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

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

c++ windows
1个回答
0
投票

您正在使用GetSaveFileName两次保存文件。

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

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

您还将以写模式打开文件两次。同样,您可能希望以写入模式("w"标志),然后是write打开文件。然后在读取模式下再次打开它("r"标志),然后再打开read

如果还涉及任何加密,那么您还需要二进制模式,因此将是"wb""rb"

在C ++中,您应该使用std::fstream而不是C样式fopen

您应该通过删除所有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",其内容不可读(未加密)。但是可以使用解密功能进行查看。


推荐问答