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