0

私はやや弱い/漠然としたデータベースを作成しています(私の経験は非常に少ないので、私のコードの混乱を許してください)。このために、コンソールプログラムが起動するたびに、データベース(userlist.txtにコピー)が既に作成されているかどうかを確認するチェックを作成します。作成されていない場合は、データベースが存在する場合は、データベースをすべてにコピーする必要があります。 'vector users'(これは構造体です)クラス'userbase'内にあり、すべてのユーザー情報が含まれます。

私のuserstats構造体は次のようになります。

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

(私はまだプログラムに「セキュリティレベル」を読み取っていないことを認識しています)

編集:リスト内の前のユーザーの「securitylevel:x」行をたどるだけのユーザーが増える可能性もあります。

ここで、プログラムが「ID:1d」という行を読み取った場合、これを構造体にコピーし、最後にすべてをベクターuserbase.users[i]に配置します。ただし、これは機能していないようです。どのifステートメントにも追いついていないようです。私は以前にこの種のプログラムを動作させることができたので、私が間違っていることを非常に混乱させています。私は本当にこれでいくつかの助けを使うことができました。コードに対する他の種類の批判は大歓迎です。

よろしく、ミケル

4

1 に答える 1

1

行には、各行に含まれる属性の値と属性のタイプが常に含まれているため、いずれもありませんif (buffer == ...)true例えば:

ID:1d

getline()読み取るとき、これには次のものbufferが含まれますID:1d

if (buffer == "ID:")

となりますfalsestring.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))
{
    ...
于 2012-04-15T22:25:52.507 に答える