0

私のプログラムは 2 つのパラメーターを受け取ります。最初のパラメーターは変更する名前で、2 番目のパラメーターは変更後の名前です。

実行後、5 月から MayMay に変更されたと思われる 2 行目がテキストファイルにありません。私のif else発言に問題があるのか​​、問題があるのか​​ わかりませんwhile(!file.fail)

これは私のオリジナルのテキストファイルです。

user;   pass;   1234; John;     1111
user1;  pass1;  2345; May;      2222
user2;  pass2;  3456; Mary;     3333
user3;  pass3;  4567; Andy;     4444
hr;     hr;     5678; Jonathan; 5555
admin;  admin;  6789; Aili;     6666
user10; pass10; 7890; eggy;     9999
user11; pass11; 9807; Mary;     7777

これは、プログラム実行後の出力テキスト ファイルです。

user;   pass;   1111;  John;

user2;  pass2;  3333;  Mary;
user3;  pass3;  4444;  Andy;
hr;     hr;     5555;  Jonathan;
admin;  admin;  6666;  Aili;
user10; pass10; 9999;  eggy;
user11; pass11; 7777;  Mary;

        pass11; 7777;  Mary;

これは私のコードです:

bool Employee::changeName(string nnn, string mmm)
{
    int i = 0;
    ifstream file("login1.txt"); // to open the file
    string name, empty, empty2, empty3, empty4; // fusername is use to store the first parameter in textfile,empty is use to store the rest of the line after the ';'
    string store[100]; // initialize a array to store textfile contents

    while (!file.fail()) // loop if file didn't fail
    {   
        getline(file, empty, ';'); // use ; as delimiter
        getline(file, empty2, ';'); // use ; as delimiter
        getline(file, empty3, ';'); // use ; as delimiter
        getline(file, name, ';'); // use ; as delimiter
        getline(file, empty3); // use line end as delimiter, and to skip the rest of the information
        string add = ""; //initialize add string to nothing when it loops

        if(name != nnn) // to check if the username in textfile do not match the user input name
        {
            add += empty + ';' + empty2 + ';' + empty3 + ';' + name + ';' + empty4; // adds back the username and rest of the line together back    
            store[i] = add; // store into an array
            cout << "i is: " << i << endl; // debugging.
            cout << "store array[] = " << store[i] << endl; // debugging..
            i++;
        }
        else if(name == nnn)
        {
            add += empty + ';' + empty2 + ';' + empty3 + ';' + mmm + ';' + empty4; // adds back the name and rest of the line together back 
            store[i];
            cout << "i is: " << i <<endl; // debugging.
            cout << "store array[] = " << store[i] << endl; // debugging..
            i++;
        }
        else{}  
    }

    remove("login1.txt"); //remove the textfile
    ofstream pwd2_file ; // initilize a outputstream textfile
    pwd2_file.open("login1.txt"); // create a new file call login1.txt

    for (int x = 0; x < i; x++)//for loop to store store[] array into login1.txt
    {
        pwd2_file << store[x] << endl; // storing into textfile
    }
    pwd2_file.close(); // close the output stream
}
4

2 に答える 2

3

空行の原因となる問題は、else-if ステートメントで名前を置き換えると、行があることです。

add += empty+';'+empty2+';'...
store[i];

そうあるべきだと思います

store[i] = add;
于 2012-10-24T18:33:01.067 に答える
1

空のempty3ままにして、ループごとに2回読み込んでいます:empty4

getline(file, empty, ';');
getline(file, empty2, ';');
getline(file, empty3, ';');  // <--- here
getline(file, name, ';');    //     
getline(file, empty3);       // <--- and here (this is supposed to be empty4, right?)

次に、効果のないステートメントを取得します(Chad Campbellによってすでに指摘されています):

store[i];

そして最後に、誤った状態: while(!file.fail())- ストリームがまだ正常なときに最後の反復に入った - すべてのデータを読み取ったが、ストリームを悪い状態にする最後の読み取りをまだ試みていない - 次の読み取りは失敗するが、それをチェックせず、前の反復からのデータを静かに再利用してください。

ブール値のコンテキスト (while(getline(...))たとえば など) で常に入力操作を使用するか、少なくとも読み取りを試みた後にストリームを確認してください。あなたの場合、次のようなものです:

while (true)
{   
    getline(file, empty, ';');
    getline(file, empty2, ';');
    getline(file, empty3, ';');
    getline(file, name, ';');
    getline(file, empty3);
    if (!file) break;

    // do stuff with data
}
于 2012-10-24T18:51:10.130 に答える