C++ cli 将随机生成的密码保存到文本文件,以便以后显示

C++ cli 将随机生成的密码保存到文本文件,以便以后显示,c++-cli,clr,C++ Cli,Clr,我目前正在接受培训,我现在必须学习我正在开发的软件。最重要的是昨天被请求的,我被它的主要功能失败绊住了:保存密码 该应用程序是在C++\CLR中使用Visual Studio 2013开发的。由于某种原因,无法安装MFC库,即使在多次重新启动后,安装仍会失败并崩溃。目的是从用户提供的种子生成密码。生成的密码将保存到.txt文件中。如果已使用种子,则会显示以前生成的密码 不幸的是,我不能将密码和种子保存到文件中,尽管如果我不能到达文档的末尾,我可以编写种子。我选择了if行为空,然后将其写入文档,但

我目前正在接受培训,我现在必须学习我正在开发的软件。最重要的是昨天被请求的,我被它的主要功能失败绊住了:保存密码

该应用程序是在C++\CLR中使用Visual Studio 2013开发的。由于某种原因,无法安装MFC库,即使在多次重新启动后,安装仍会失败并崩溃。目的是从用户提供的种子生成密码。生成的密码将保存到.txt文件中。如果已使用种子,则会显示以前生成的密码

不幸的是,我不能将密码和种子保存到文件中,尽管如果我不能到达文档的末尾,我可以编写种子。我选择了if行为空,然后将其写入文档,但它不起作用,我无法找到原因。不过,我可以读取密码没有任何问题

以下是源代码的相互测试部分:

int seed;
char genRandom() {
    static const char letters[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    int stringLength = sizeof(letters) - 1;
    return letters[rand() % stringLength];
}
System::Void OK_Click(System::Object^  sender, System::EventArgs^  e) {
    fstream passwords;
    if (!(passwords.is_open())) {
        passwords.open("passwords.txt", ios::in | ios::out);
    }
    string gen = msclr::interop::marshal_as<std::string>(GENERATOR->Text), line, genf = gen;
    bool empty_line_found = false;
    while (empty_line_found == false) {
        getline(passwords, line);
        if (gen == line) {
            getline(passwords, line);
            PASSWORD->Text = msclr::interop::marshal_as<System::String^>(line);
            break;
        }
        if (line.empty()) {
            for (unsigned int i = 0; i < gen.length(); i++) {
                seed += gen[i];
            }
            srand(seed);
            string pass;
            for (int i = 0; i < 10; ++i) {
                pass += genRandom();
            }
            passwords << pass << endl << gen << "";
            PASSWORD->Text = msclr::interop::marshal_as<System::String^>(pass);
            empty_line_found = true;
        }
    }
}

所以,这里有一件有趣的事情:

passwords << pass << endl << gen << "";
getline将一直读取,直到看到一行结束或EOF。如果没有换行符,它将命中该EOF,然后在流上设置EOF位。这意味着您下次尝试这样做时:

passwords << pass << endl << gen << "";
流将拒绝写入任何内容,因为它处于eof状态。您可以在此处执行多种操作,但最简单的方法是执行密码。清除可删除任何错误标志,如eof。不过,对于意外清除真正的错误标志,我会非常谨慎;仔细阅读fstream的文档


<>我也重申了我对C++ + CLL是一种黏合剂语言的评论,而不是一个用于通用开发的伟大语言,它最好用C++或.NET语言来完成,比如C。如果你因为某种原因完全绑定到C++ +CLR,您还可以使用广泛的.net库,这样就不必来回无意义地使用托管类型。请参阅示例。

用C++-CLI编写应用程序是一个非常糟糕的想法。只使用胶水代码,这样你就可以在托管应用程序中使用C++的东西。用C语言或其他CLR语言编写剩下的托管代码,开发速度更快、更简单,你的生活将更容易。或者,如果你与C++结合,编写一个简单漂亮的命令行应用程序,避免与庞大的UI库和语言扩展混淆u如果我没有到达文档的末尾,我可以编写种子uu意味着您遇到了EOF,并且没有清除文件流的状态标志,因此它将拒绝接受更多的输入。我也会避免对你仍在读取的文件进行格式化写入,但那只是我自己。问题是我对C一无所知,我必须创建一个不是控制台应用程序的应用程序。我正在做的另一个项目,也是在CLI中,做得很好。@PointR:如果你成功地制作了一个带有GUI的C++/CLI应用程序,你对C的了解比你想象的要多。
getline(passwords, line);
passwords << pass << endl << gen << "";