1

我的程序允许用户在输入用户名时删除指定的记录。当它们传入名称时,它会调用一个方法将它们存储到一个数组中,并将它们写回文件而不附加,以便重新写入文件。但是在存储部分存在一些问题,我的文本文件的最后一行没有正确存储,而是从第二行复制并复制到包含名称的最后一行。希望 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

您的循环的问题是,当您到达文件末尾时,您的流还没有失败。它只会在下一次读取时失败,但您没有对此进行验证。

因此,您的数组包含最后一条记录两次。

你有一个空字符串作为第一个字段可能是因为它将这个设置为空以读取它,(流尚未处于失败状态)或者因为在你的输入文件末尾有一个空行得到读入。

为您的用户及其数据创建一个结构,并从流中读取。如果整个读取成功,您可以附加到您的数据集。

我建议你使用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

我建议使用调试器,然后弄清楚什么被忽略了。在输出存储在数组中的位置或将其重写到文件时,看起来像是一个错误。可以解释您缺乏边界用户。

于 2012-10-24T12:37:50.480 回答