我正在尝试从.txt文件中删除一行.该文件包含有关该帐户的所有信息.
该行显示“newAccount”并在创建帐户时生成.我使用它,以便我可以在您第一次登录时启动教程.在教程之后我想删除此行,以便在下次登录时您不会获得教程.
下面是一段代码:(不起作用)
void loginScreen(string user){
system("CLS");
cout << "Hello " + user << endl;
ifstream file(user + ".txt");
string line1;
getline(file, line1);
// Begin reading your stream here
string line2;
getline(file, line2);
if(line2 == "newAccount"){
cout << "Your account is new";
char cUser[200];
strcpy_s(cUser, user.c_str());
std::ofstream newFile( user + ".txt.new" );
// Do output...!!!!!!!
newFile << line1;
newFile.close();
if ( newFile ) {
remove( cUser + ".txt" );
rename( cUser + ".txt", cUser + ".txt" );
} else {
std::cerr << "Write error on output" << std::endl;
}
}
}
编辑:
我已经编辑了我的代码,它仍然无法正常工作:
const string oldFileName(user + ".txt");
const string newFileName(user + ".txt.new");
std::ofstream newFile( user + ".txt.new" );
// Do output...!!!!!!!
newFile << line1;
newFile.close();
if(line2 == "newAccount"){
ofstream newFile(newFileName.c_str()); // c++11 allows std::string
if (newFile){
if (0 == remove( oldFileName.c_str() )){
if (0 != rename( newFileName.c_str(), oldFileName.c_str() )){
// Handle rename failure.
}
}else{
// Handle remove failure.
}
}
最佳答案 这个:
rename( cUser + ".txt", cUser + ".txt" );
有两个原因是不正确的:
>它是指针算术而不是字符串连接,因为cUser是一个char []
>即使它是正确的连接旧文件名和新文件名是相同的
没有理由使用strcpy_s(),对std :: string使用operator:
const std::string oldFileName(user + ".txt");
const std::string newFileName(user + ".txt.new");
std::ofstream newFile(newFileName.c_str()); // c++11 allows std::string
if (newFile && newFile << line1)
{
newFile.close();
if (newFile)
{
if (0 == remove( oldFileName.c_str() ))
{
if (0 != rename( newFileName.c_str(), oldFileName.c_str() ))
{
// Handle rename failure.
}
}
else
{
// Handle remove failure.
}
}
}
在尝试删除()之前,请记住file.close().
始终检查IO操作的结果,代码不确认文件是否已打开或者是否有任何getline()尝试成功:
ifstream file(user + ".txt");
if (file.is_open())
{
string line1, line2;
if (getline(file, line1) && getline(file, line2))
{
// Successfully read two lines.
}
}