我正在创建一个有点弱/模糊的数据库(我的经验非常少,请原谅我的代码混乱)。为此,我每次启动控制台程序时都会创建一个检查,检查是否已创建数据库(复制到userlist.txt),如果没有创建新数据库,如果数据库存在,则应将其全部复制到'vector users'(这是一个结构)我在类'userbase'中有一个包含所有用户信息的类。
我的userstats struct看起来像这样,
enum securityLevel {user, moderator, admin};
struct userstats
{
string ID;
string name;
string password;
securityLevel secLev;
};
我将在此代码中包含文本文件中的所有信息,
int main()
{
Userbase userbase; // Class to contain userinformation during runtime.
ifstream inFile;
inFile.open("userlist.txt");
if(inFile.good())
{
// ADD DATE OF MODIFICATION
cout << "USERLIST FOUND, READING USERS.\n";
userstats tempBuffer;
int userCount = -1;
int overCount = 0;
while(!inFile.eof())
{
string buffer;
getline(inFile, buffer);
if (buffer == "ID:")
{
userCount++;
if (userCount > overCount)
{
userbase.users.push_back(tempBuffer);
overCount++;
}
tempBuffer.ID = buffer;
cout << "ID"; // Just to see if works
}
else if (buffer == "name:")
{
cout << "name"; // Just to see if works
tempBuffer.name = buffer;
}
else if (buffer == "password:")
{
cout << "password"; // Just to see if works
tempBuffer.password = buffer;
}
}
if (userCount == 0)
{
userbase.users.push_back(tempBuffer);
}
inFile.close();
}
...
我尝试做的是阅读和分析文本文件的每一行。 userlist.txt的一个例子可以是,
created: Sun Apr 15 22:19:44 2012
mod_date: Sun Apr 15 22:19:44 2012
ID:1d
name:admin
password:Admin1
security level:2
(我知道我还没有在程序中读到“安全级别”)
编辑:可能还有更多用户只是遵循列表中前一个用户的“安全级别:x”行。
现在,如果程序读取“ID:1d”行,则应将其复制到结构中,最后我将把它全部放入向量userbase.users [i]中。但是,这似乎不起作用。它似乎没有抓住任何if语句。我之前已经开始使用这种程序了,所以我很困惑我做错了什么。我真的可以使用一些帮助。对代码的任何其他批评都是非常受欢迎的。
此致 的Mikkel
答案 0 :(得分:1)
if (buffer == ...)
都不会是true
,因为这些行总是包含每行所包含的属性的值以及属性的类型。例如:
ID:1D
getline()
读取时buffer
将包含ID:1d
所以:
if (buffer == "ID:")
将是false
。请改用string.find()
:
if (0 == buffer.find("ID:")) // Comparing to zero ensures that the line
{ // starts with "ID:".
// Avoid including the attribute type
// in the value.
tempBuffer.ID.assign(buffer.begin() + 3, buffer.end());
}
由jrok评论,while
用于阅读文件的内容不正确,因为getline()
之后没有立即检查。改为:
string buffer;
while(getline(inFile, buffer))
{
...