@Miyagi_4ever

Почему в C++ не удаётся чтение при помощи fstream объекта, записанного в файл при помощи того же fstream?

Я пытаюсь создать псевдомессенджер. В моем мессенджере есть внутренний класс User. Когда регистрирую пользователя я записываю его как объект класса User в отдельный файл "RegisteredUsers.txt". Сделал я это для того чтобы - допустим если я записал этого пользователя в файл пусть будет имя - user1, номер телефона - 1234, я зарегистрирую другого пользователя например имя user2, номер 7890 - чтобы user2 мог нажать "Добавить контакт" и поискать по номеру кого-то (Метом добавлю потом) и допустим user2 нашел по номеру 1234 юзера1, и так user2 сможет написать юзеру1 сообщение. А если user2 ввел неправильный номер чтобы вылезала ошибка что "нет такого пользователя". Поэтому я и записываю в файл юзеров чтобы они могли найти друг друга. Но вот в чем беда - не получается чтение объекта из файла. Записать то могу, они записываются но вот чтение никак не получается.

Чтение я использовал для того чтобы проверить есть ли уже аккаунт с таким номером, если есть то по моей задумке должна выводиться ошибка.
Первый пользователь успешно записывается, а когда стараюсь зарегистрировать второго вылезает это ошибка именно в той проверке. Обращаю внимание- когда я записываю первого пользователя это ошибка не вылезает так как fstream (in) может открыть только существующий файл, f.is_open() дает false и проверка не срабатывает. Когда же я стараюсь зарегистрировать второго уже срабатывает проверка так как когда мы записывали первого fstream (out) создал файл.

Мой код
#include <iostream>
using namespace std;

#include <fstream>
class Messenger
{
public:

	void to_register(string newUserName, string newUserPhoneNumber)
	{
		/*path = "RegisteredUsers.txt";
		f.open(path, fstream::in);

		if (f.is_open())
		{
			User tempUser;

			while (f.read((char*)&tempUser, sizeof(User)))
			{
				
			}
			usersCount = tempUser.ID;
		}
		else
		{
			
		}

		f.close();*/

		path = "RegisteredUsers.txt";
		f.open(path, fstream::in);

		if (f.is_open())
		{
			User tempUser;

			while (f.read((char*)&tempUser, sizeof(User)))
			{
				if (tempUser.phoneNumber == newUserPhoneNumber)
				{
					cout << "Error. User with this phone number already exists.";
					return;
				}
			}
		}
		else
		{
			
		}

		f.close();


		User newUser(newUserName, newUserPhoneNumber);

		path = "RegisteredUsers.txt";
		f.open(path, fstream::out | fstream::app);

		if (f.is_open())
		{
			f.write((char*)&newUser, sizeof(User));
		}
		else
		{
			
		}

		f.close();
	}

private:
	class User
	{
	public:
		User()
		{
			name = "";
			phoneNumber = "";
		}

		User(string name, string phoneNumber)
			: name(name), phoneNumber(phoneNumber)
		{
			
		}

		string name;
		string phoneNumber;
	};

	fstream f;
	string path;
};

int main()
{
	setlocale(LC_ALL, "ru");

	Messenger Telegram;

	Telegram.to_register("Aeris", "+994703228276");

	return 0;
}
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
string нельзя так писать. Потому что сам класс хранит в себе указатели на данные. И sizeof() у него всегда одинаковый, какой длины строчка бы не была. Вы записали какие-то адреса в файл, а когда прочитали - там лежит мусор. Поэтому на каких-то внутренних механизмах строки и происходит ошибка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы