1

私のプログラムでは、ユーザーがユーザー名を入力するときに、指定したレコードを削除できます。それらが名前を渡すと、それらを配列に格納するメソッドを呼び出し、ファイルを再書き込みするために、追加せずにファイルに書き戻します。しかし、保存部分でテキストファイルの最後の行が正しく保存されず、代わりに最後から2番目の行からコピーされ、名前が含まれている最後の行にコピーされるという問題があります。うまくいけば、no1は混乱するでしょう:/。配列内に保存されているテキストファイルとデータの例を以下に示します。以下では、画像をより鮮明にするために太字と斜体を使用し、deleteRecのメソッドも示しています。

これは私のテキストファイルに含まれているものです。

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

これは、削除するプログラムを実行したときの出力です。

Data stored in store[] array: user1;pass1;2345;May;2222
Data stored in store[] array: user2;pass2;3456;Mary;3333
Data stored in store[] array: user3;pass3;4567;Andy;4444
Data stored in store[] array: hr;hr;5678;Jonathan;5555
Data stored in store[] array: admin;admin;6789;Aili;6666
Data stored in store[] array: user10;pass10;7890;eggy;9999
***Data stored in store[] array: ;pass10;7890;eggy;9999***
Data stored in store[] array: 


bool Employee::deleteRec(string nm)
{
    int count;
    int i=0;//for looping
    ifstream file("login1.txt");
    string fusername,empty;
    string store[100];//initialize a array to store textfile contents
    while (!file.fail()) 
    {       
        getline(file,fusername,';');// use ; as delimiter
        getline(file,empty);// use line end as delimiter, and to skip the rest of the information
        string add="";//initialize add string to nothing when it loops
        add += fusername+';'+empty; //adds back the username and rest of the line together back
        if(fusername!=nm)//to check if the username in textfile do not match the user input name
        {
            store[i]=add; //store into an array
            cout<<"i is: "<<i<<endl;
            cout<<"store array[] = "<<store[i]<<endl;
            i++;
        }
        else{}
    }

    //ofstream pwd2_file ("login1.txt", ios::app); //suppose to user this if im writing to file

    for(int x=0;x<i+1;x++)
    {
        cout<<"Data stored in store[] array: "<<store[x]<<endl;
    }

    return false;
}
4

2 に答える 2

1

ループの問題は、ファイルの終わりに達したときに、ストリームがまだ失敗していないことです。次の読み取りでのみ失敗しますが、これを確認していません。

したがって、配列には最後のレコードが 2 回含まれています。

最初のフィールドとして空の文字列があるのは、これを空に設定して読み込むため (ストリームはまだ失敗した状態ではなかった)、または取得した入力ファイルの最後に空の行があったためです。読み込んでください。

ユーザーとそのデータの構造体を作成し、ストリームから読み込みます。この読み取り全体が成功した場合は、データセットに追加できます。

std::vectorこれとに使用することをお勧めしますpush_back()

ループする正しい方法は次のとおりです。

struct EmployeeData
{
    std::string name;
    // fill in members
;

std::istream& operator>>( std::istream& is, EmployeeData& emp )
{
     std::getline( is, emp.name(), ';' );
     // etc.

     return is;
}

std::vector< EmployeeData > emps;
EmployeeData emp;
while( is >> emp )
{ 
   emps.push_back( emp );
}
于 2012-10-24T12:30:57.803 に答える
0

デバッガーを使用して、何が渡されているかを把握することをお勧めします。出力が配列に格納されている場所、またはファイルに書き直されたときのいずれかで、off by one エラーのように見えます。境界ユーザーの不足を説明します。

于 2012-10-24T12:37:50.480 に答える