@Klindeu

Как записать структуру в файл на языке C++?

Нужно создать приложение которое бы записывала структуру в файл и выводило из файла на экран.
Попытался это реализовать.
Но к сожалению не записывает всю структура в файл. Или некорректно записывает.

Вот сам код который я пытался реализовать:
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include <iostream>
#include <fstream>
using namespace std;





void inputf(ifstream &f, char a[300], char b[300], char c[300], char d[300]);
void outputf1(ofstream &f, char a[300], char b[300], char c[300], char s[40]);
void main() // Основная функция
{
	int c;
	setlocale(LC_ALL, "Russian");
	cout << "Вывести на экран-1\nЗаписать в файл-2" << endl;
	cin >> c;
	if (c == 2)
	{
		int const N = 3;
		int i,j=0;
		struct vvod {
			char fam[300];
			char id[300];
			char number[300];
		};
		vvod v[N];
		for (i = 0; i < N; i++)
		{
			cout << "Введите фaмилию(Eng):" << endl; cin >> v[i].fam;
			cout << "Введите ID:" << endl; cin >> v[i].id;
			cout << "Введите номер:" << endl; cin >> v[i].number;
		}
		
		ofstream f1;
		for (i = 0; i < N; i++)
		{
			
			outputf1(f1, v[i].fam, v[i].id, v[i].number, "writer.txt");
			
		}
		
	}
	else if (c == 1)
	{
		char str[40];//Строковая переменная (для пути к файлу)
		cout << "\n Введите имя файла \n";
		cin >> str;
		char v[900];
		char q[300];
		char w[300];
		char e[300];
		ifstream f;
		inputf(f,str,q,w,e);

	}
}

void outputf1(ofstream &f, char a[300], char b[300], char c[300], char s[40])//Функция для записи
											   
{
	f.open(s);//Открываем файл
			  //Проверка успешности открытия файла:
	if (f.fail()) {
		cout << "\n Ошибка открытия файла";
		exit(1);
	}
	f << a;//записываем переменную в файл
	f << b;
	f << c;
	f.close();//Закрываем файл
}

void inputf(ifstream &f, char a[300],char b[300], char c[300],char d[300] )//Функция для чтения 
{
	f.open(a);//Открываем файл
	//Проверка успешности открытия файла:
	if (f.fail()) {
		cout << "\n Ошибка открытия файла";
		exit(1);
	}
	f >> b;//Читаем переменную из файла
	f >> c;
	f >> d;
	cout << b << endl;
	cout << c << endl;
	cout << d << endl;
	f.close();//Закрываем файл
}


Подскажите где накосячил.
  • Вопрос задан
  • 3557 просмотров
Пригласить эксперта
Ответы на вопрос 1
@none7
Операторы >> и << очень капризны. И char[300] они распознают как char*. Может случиться переполнение буфера если символов больше 300 и чтение или запись будет остановлено если встретится символ пробела, конца строки или \0. Соответственно при записи пишется не 300 байт, а до разделителя. При чтении никаких разделителей не встретится так, что всё будет прочитано всё в первую структуру и может произойти переполнение буфера. Используйте istream::getline(void), istream::read(char* buf, streamsize n), ostream::write(const char* buf, streamsize n);
Вообще лучше не смешивать Си и С++, по всюду будут вылазить те или иные баги. Вместо char[300] std::string, вместо массивов std::array или std::vector. От фиксированной длины тоже желательно избавиться и сириализовать данные скажем в .csv
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы