[英]How to make a C++ program that works with a .txt file without showing it
我的程序需要使用一个隐藏的文本文件来跟踪用户名。
但是,当程序启动时,如果无法在同一目录中找到“ Name.txt”文件,则会生成一个对用户可见的文件。
用户可以查看,编辑等等。 如何防止这种情况发生,以便只有我的程序才能修改文件?
另外,还有更好的方法来保持用户名的知识吗(请记住,我是一般编程人员的新手,不仅限于C ++)?
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <Windows.h>
using std::string;
using std::cout;
using std::cin;
using std::ifstream;
using std::ofstream;
int main()
{
string line;
ifstream example;
example.open("Name.txt");
getline(example, line);
if (line.compare("") == 0)
{
example.close();
string con;
cout << "Welcome to this program!\n";
cout << "Do you want to register? (y/n) ";
cin >> con;
con[0] = tolower(con[0]);
if (con.compare("n") != 0)
{
string name;
ofstream one;
one.open("Name.txt");
cout << "What's your name? ";
cin >> name;
one << name;
one.close();
cout << "See you later " << name << ".";
Sleep(4000);
}
}
else
{
cout << "Welcome back " << line << ".";
example.close();
Sleep(4000);
}
}
编辑:我刚刚意识到我说过“要跟踪用户”。 现在我意识到了为什么你们认为我想对此程序做一些不好的事情。 我现在纠正了它,我的意思是“跟踪用户名 ”。
我了解您想维护一个包含所有注册用户名或其他与当前用户无关的数据的文件。
问题
您的代码尝试在程序的当前工作目录中打开文件。 不幸的是,这取决于用户启动程序的方式。
在读取文件时,它也将忽略打开期间的可能错误。 因此,如果该文件不存在,你的代码将打开文件ofstream
写(这将创建该文件,如果不存在的话)。
怎么解决呢?
为了满足您的要求,您应该在预定位置(例如,在安装过程中或在程序的配置中固定)打开文件。 有关在Windows平台上理想地将数据和配置文件存储在何处的信息,请参阅本文 。
如果要确保程序仅在文件已经存在的情况下打开文件,则应在ifstream
上验证open
结果,并在失败的情况下发出错误消息:
example.open("Name.txt");
if (!example) {
cout << "OUCH ! Fatal error: the registration file couldn't be opened !" <<endl;
exit (1);
}
如何保护文件免受用户侵害?
但是请注意,如果程序从文件中读取和写入数据,则用户也可以找到它并手动编辑它。 这将很难预防。
或者,您可以考虑使用Windows 注册表 ,这对于用户进行编辑来说不是那么简单(尽管并非不可能)。 这种方法的主要不便之处在于,它依赖于系统,这将使您的代码向其他平台的移植更加困难。
如果要完全保护文件,可以按照Chris在注释中的建议对文件进行加密。 加密是一项复杂的业务; 考虑使用诸如openssl之类的库或经过验证的算法 。
这样可以保护您免受普通用户的侵害。 但是您仍然会遇到黑客,他们能够对您的代码进行反向工程,并找到必须以某种方式嵌入到您的代码中才能解密文件的加密密钥。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.