0

我的程序有两个参数,第一个参数是要更改的名称,第二个参数是要更改的名称。

执行后,我的文本文件缺少第二行,假设从 May 更改为 MayMay。我不确定我的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每个循环中读取两次,同时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 回答