Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2010, 21:37   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию Чтение структуры из файла

Привет.
Возникла такая проблема.
При таком коде
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

struct history
	{
		char *incident;
		int number;
		int month;
		int year;
	};

int main()
{
	int n=3;
	history a[3], d[3];
	a[0].incident="1 World war"; a[0].number=28; a[0].month=7; a[0].year=1914;
	a[1].incident="Revolution"; a[1].number=7; a[1].month=11; a[1].year=1917;
	a[2].incident="2 World war"; a[2].number=1; a[2].month=9; a[2].year=1939;

	FILE *F, *G;
	F=fopen("D:\\history", "wb");
	fwrite(&n, sizeof(int), 1, F);
	fwrite(a, sizeof(history), n, F);
	fclose(F);

	G=fopen("D:\\history", "rb");
	fread(&n, sizeof(int), 1, G);
	fread(d, sizeof(history), n, G);

	for (int i=0; i<n; i++)
		cout<<d[i].incident<<"\t"<<d[i].number<<"\t"<<d[i].month<<"\t"<<d[i].year<<"\n";

	fclose(G);
	return 0;
}
Все работает нормально.
Удаляю все, что касается записи в файл (файл history на диске уже существует)
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

struct history
	{
		char *incident;
		int number;
		int month;
		int year;
	};

int main()
{
	int n=3;
	history d[3];
	
	FILE *G;
	G=fopen("D:\\history", "rb");
	fread(&n, sizeof(int), 1, G);
	fread(d, sizeof(history), n, G);
	
	for (int i=0; i<n; i++)
		cout<<d[i].incident<<"\t"<<d[i].number<<"\t"<<d[i].month<<"\t"<<d[i].year<<"\n";

	fclose(G);
	return 0;
}
После компиляции поле incident не выводится с остальным все в порядке, в чем проблема понять не могу.
Спасибо
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 05.10.2010, 23:52   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

use std::string, std::fstream
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 06.10.2010, 06:38   #3
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Если не трудно вставте пожалуйста в код.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 06.10.2010, 10:25   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вы для incident память не выделили.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 06.10.2010, 10:48   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Цитата:
Вы для incident память не выделили.
Коды вида
char *a="csadfsdf";
cout<<a;
Всегда работали прекрасно. Не думаю, что в этом проблема. К тому же в первом варианте программы все работает без выделения памяти.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 06.10.2010, 10:53   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Всегда работали прекрасно.
Да, но во втором коде ты считываешь строки из файла, а не инициализируешь переменные. Потому тебе просто необходимо выделить память для incident во втором примере, чтоб fread могла считать в готовый массив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.10.2010, 11:14   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
char *a="csadfsdf";
cout<<a;
Что тут происходит - в стеке создается константный массив символов (строковой литерал), который висит там вплоть до окончания работы программы. Затем указателю a тупо присваивается адрес висящего в стеке массива, и этот массив потом просто выводится.
В ситуации, отличной от использования строкового литерала такой номер не прокатит. Даже в таком случае:
Код:
char* s;
std::cin >> s;
std::cout << s;
у вас ничего не выйдет, т.к. под s память не выделена. Поэтому надо писать примерно так:
Код:
char* s;
s = new char[20];
std::cin >> s;
std::cout << s;
//...
delete[] s;
Или же пользоваться статическими массивами, что, впрочем, зачастую нерационально.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 06.10.2010, 15:46   #8
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Что то никак не идет прога может быть что то с выделением памяти не то делаю. Посмотрите пожалуйста.
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

struct history
	{
		char *incident;
		int number;
		int month;
		int year;
	};

int main()
{
	int n;// Количество элементов массива записано в файле
	FILE *G;
	G=fopen("D:\\history", "rb");
	fread(&n, sizeof(int), 1, G);
	history *d=new history[n];

	for (int i=1; i<n; i++)
		d[i].incident=new char[30];

	fread(d, sizeof(history), n, G);
	
	for (int i=0; i<n; i++)
		cout<<d[i].incident<<"\t"<<d[i].number<<"\t"<<d[i].month<<"\t"<<d[i].year<<"\n";

	fclose(G);
	return 0;
}
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 06.10.2010, 16:48   #9
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Покажи структуру записей в файле
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 06.10.2010, 17:05   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Автор, вот тебе для раздумий:http://www.programmersforum.ru/showthread.php?t=105501
Я бы именно так делал, вместо считывания сразу всего в массив и выделения памяти.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение файла lapo4ka1368 Общие вопросы C/C++ 0 07.04.2010 17:15
сохранение/чтение структуры с файла Vorname Общие вопросы C/C++ 4 10.11.2009 17:59
Запись структуры и чтение из файла [MI_nor] Общие вопросы C/C++ 6 08.04.2009 15:52
Чтение структуры файла SDK Помощь студентам 4 23.01.2008 19:30
чтение файла Arteom Общие вопросы Delphi 6 27.08.2007 18:15