我的程序分为两个参数,第一个参数是要更改的名称,第二个参数是更改它的名称。
执行后,我的textfile缺少第二行,这是从5月到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
}
导致空行的问题是,当您替换else-if语句中的名称时,您有行
add += empty+';'+empty2+';'...
store[i];
我猜那应该是
store[i] = add;
您正在阅读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?)
然后您有一个没有效果的声明(乍得·坎贝尔已经指出):
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
}