По какой-то причине приведенный ниже код не добавляет пользователя в файл user.txt. Он всегда заканчивается структурой if(file.fail())
. Любая идея о том, как это исправить? Я попытался закрыть и открыть тот же файл еще раз, прежде чем писать пользователю. Но это тоже не работает.
void users::userAdd()
{
std::string username;
std::string function;
std::string user;
std::size_t found;
std::string line;
std::fstream myfile ("C:\\Users\\kk\\Desktop\\users.txt", std::ios_base::in | std::ios_base::out | std::ios_base::app);
if (!myfile || !myfile.good())
{
std::cout << "could not open file!\n";
}
if (myfile.is_open())
{
std::cout<<"new username:";
std::cin>>username;
while (! myfile.eof())
{
getline (myfile,line);
found = line.find(username);
if (found != std::string::npos)
{
std::cout<<"User already exists"<<std::endl;
return;
}
}
std::cout<<"Function:";
std::cin>>function;
user = username+ " " + function;
myfile << user;
myfile.close();
}
if (myfile.fail())
{
std::cout << "Failed to append to file!\n";
}
}
EDIT: Спасибо за быстрые ответы, очень ценю это. Я удалил std::ios_base::append
и добавил пару строк: (он работает так, как я хочу)
...
std::cout<<"functie:";
std::cin>>functie;
myfile.clear();
myfile.seekg(0, myfile.end);
user = "\n" + gebruikersnaam + " " + functie;
myfile << user;
myfile.close();
...
Вы не перематываете файл, т.е. Переставляете указатель чтения/записи в начало файла. Использование std::ios_base::app
означает, что указатель чтения/записи является позицией в конце файла.
Вероятно, вы должны std::ios_base::app
. Таким образом ваше while
-loop будет читать весь файл и эффективно позиционировать указатель в конце файла перед его добавлением.
См. Также: этот вопрос.
PS: Это выглядит ошибкой:
if (found != std::string::npos) {
std::cout<<"User already exists"<<std::endl;
return;
}
что, если username
- подстрока line
?
Поместите myfile.tellg(0), чтобы начать rwading с начала файла.
std::fstream::clear()
после прочтения всего ввода, перед добавлением записи в файл, вызовитеstd::fstream::seekg()
чтобы установить позицию записи. Также обратите вниманиеwhile (! myfile.eof())
поднимает некоторые проблемы.getline
?