C ++ не добавляется в текстовый файл

0

По какой-то причине приведенный ниже код не добавляет пользователя в файл 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();
    ...
  • 0
    Вызовите std::fstream::clear() после прочтения всего ввода, перед добавлением записи в файл, вызовите std::fstream::seekg() чтобы установить позицию записи. Также обратите внимание while (! myfile.eof()) поднимает некоторые проблемы.
  • 1
    Сначала вы открываете файл в режиме добавления, в котором указатель файла располагается за концом файла. Затем вы пытаетесь прочитать строку из него. Что вы ожидаете вернуть getline ?
Показать ещё 1 комментарий
Теги:
file
text
append

2 ответа

2
Лучший ответ

Вы не перематываете файл, т.е. Переставляете указатель чтения/записи в начало файла. Использование 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?

0

Поместите myfile.tellg(0), чтобы начать rwading с начала файла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню