@ashot_powershot

Почему считывается с файла только 1 слово, а не весь текст?

#include <iostream>
#include <string>
#include<Windows.h>
#include<fstream>
#include"Head.h"

using namespace std;

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	setlocale(LC_ALL, "");

	const int size = 4;
	string address1, path = "myfile.txt";;
	int home1, floor1, room1, square1, u=3;
	House arr[size];
	ofstream fout;
	ifstream fin;

	House g("Молокова", 26, 47, 4, 68);
	arr[0].setsuper("Молокова", 26, 47, 4, 68);
	House h("Ленина", 10, 18, 6, 93);
	arr[1].setsuper("Ленина", 10, 18, 6, 93);
	House i(h);
	arr[2].setsuper("Ленина", 10, 18, 6, 93);
	cout << "Улица,номер дома, этаж, кол-во комнат, площадь " << endl;
	for (int a = 3; a < 4; a++)
	{
		cin >> address1;
		cin >> home1;
		cin >> floor1;
		cin >> room1;
		cin >> square1;

		arr[a].setaddress(address1);
		arr[a].sethome(home1);
		arr[a].setfloor(floor1);
		arr[a].setroom(room1);
		arr[a].setsquare(square1);
	}
	cout << endl;
	cout << "Вывод массива: " << endl;
	for (int i = 0; i <= 3; i++)
	{
		arr[i].getinfo();
		cout << endl;
	}
	cout << endl;
	fout.open(path);
	if (!fout.is_open())
	{
		cout << "Ошибка открытия файла!" << endl;
	}
	else
	{
		cout << "Файл открыт!" << endl;
		for (int i = 0; i < size; i++)
		{
			fout.write((char*)&arr[i], sizeof(House));
		}
	}
	fout.close();
	fin.open(path);
	if (!fin.is_open())
	{
		cout << "Ошибка открытия файла!" << endl;
	}
	else
	{
		House pnt;
		cout << "Файл открыт!" << endl;
		while (fin.read((char*)&pnt, sizeof(House)))
		{
			pnt.getinfo();
		}
	}

	fin.close();

}


74 строка, не понимаю почему не работает
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
Не раскрыта тема о классе House. Не видя его трудно что-то сказать.

Но могу предположить, что в House, например, поле address является std::stringом.
А std::string хранит свою строку в динамической памяти и sizeof(std::string) в общем случае совсем не равен размеру хранящейся в нем строки. Записывая в файл sizeof(std::string) байт вы записываете грубо говоря только адрес памяти где лежит строка и размер строки, но не саму строку.
Вам нужно делать нормальную сериализацию/десериализацию полей объекта House.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Если просто через >> читать std::string из std::cin, то он будет читать одно слово.
Чтобы прочитать всю стороку используйте cin.getline.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час