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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2010, 01:15   #1
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию Чтение массива из файла

Здравствуйте, господа.

Заранее извиняюсь за то, что задаю, скорее всего, не самый умный вопрос на этом форуме и за то, что такая тема уже, возможно, тут когда-либо присутствовала, однако стоит отметить, что поиском я пользоваться всё же пытался.

Если у вас есть время прочитать о том, что у меня не получается сделать, буду очень признателен.

Мне необходимо сделать две функции - записи данных в файл и чтения их из него.

Для записи у меня 5 целочисленных переменных (назовём их, например, value_1 - value_5), а также трёхмерный массив int huge a1 [100][80][24].

Функция записи в файл у меня выглядит след. образом:

Код:
void save_game ()
{
	fstream fp;
	fp.open ("save.sav", ios::out);
	fp << n << " " << load_map << " " << local_pos << " " << map_locations << " " << start_map << " ";
	for (n = 0; n < 100; n++)
	for (i = 0; i < 80; i++)
	for (j = 0; j < 24; j++)
	fp << location[n][i][j] << " ";
	cout << "Saving complete" << endl << endl << "Press any key to quit";
	getch ();
	exit (EXIT_SUCCESS);
}
Функция чтения из файла у меня выглядит след. образом:

Код:
int load_game ()
{
	fstream fp;
	fp.open ("save.sav", ios::in);
	fp >> n >> load_map >> local_pos >> map_locations >> start_map;
	cout << n << load_map << local_pos << map_locations << start_map;
	local_map_value = n;
	for (n = 0; n < 100; n++)
	for (i = 0; i < 80; i++)
	for (j = 0; j < 24; j++)
	fp >> location[n][i][j];
	n = local_map_value;
	cout << "Loading complete" << endl << endl << "Press any key to quit";
	getch ();
	exit (EXIT_SUCCESS);
	return n, location[n][i][j], load_map, local_pos, map_locations, start_map;
}
На самом деле, из функции чтения выход всё же не осуществляется, идёт переход на другую функцию, которая уже будет использовать переменные из файла.

Создание файла и сохранение абсолютно всех переменных осуществляется прекрасно. Если сменить расширение файла, который мы создаём, на .txt, то можно даже узнать, что сохраняются именно те значения, которые надо. Проблема в том, что читаются лишь некоторые переменные - точнее, только первые из них. Сначала я думал, что дело в том, что я не так использовал fstream. Когда я попробовал использовать fprintf и fscanf, то проблема всё равно осталась. Потом я решил, что дело в цикле for - попробовал использовать некоторые другие способы. Разумеется, это тоже не помогло.

Для проверки, что же в итоге происходит со значениями, которые не читает из файла, я написал вот такое и увидел, что все значения он показывает как нули:

Код:
	for (n = 0; n < 100; n++)
	{
	for (i = 0; i < 80; i++)
	{
	for (j = 0; j < 24; j++)
	{
	cout << location[n][i][j];
	}
	}
	}
В чём тут может быть дело?

Заранее благодарю за возможные ответы.
YourLastSong вне форума Ответить с цитированием
Старый 12.12.2010, 12:38   #2
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Выдаётся ошибка:

Цитата:
Temporary used for parameter 1 in call to 'istream:perator >> (int &)'
Происходит это в данном месте:

Код:
fp >> location [n][i][j]
YourLastSong вне форума Ответить с цитированием
Старый 12.12.2010, 13:00   #3
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Код:
int main()
{
	int a = 11, b = 22, c = 33, d = 44, e = 55;
	int arr3d[100][80][24];
	fstream fs;

	srand(123);
	for (int i=0; i<100; i++)
		for (int j=0; j<80; j++)
			for (int k=0; k<24; k++)
				arr3d[i][j][k] = -100+ rand()%200;

	//сохранение
	cout << "Сохранение..." << endl;
	fs.open("save.txt", ios::out | ios::trunc);
	if (fs.is_open())
	{
		fs << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ';
		for (int i=0; i<100; i++)
			for (int j=0; j<80; j++)
				for (int k=0; k<24; k++)
					fs << arr3d[i][j][k] << ' ';
		fs.close();
		cout << "Сохранение успешно завершено." << endl;
	}
	else
		cout << "Сохранение не удалось." << endl;


	//обнуление
	a = b = c = d = e = 0;
	memset((void*)arr3d,0,100*80*24*sizeof(int));

	//загрузка
	cout << "Загрузка..." << endl;
	fs.open("save.txt", ios::in);
	if (fs.is_open())
	{
		fs >> a >> b >> c >> d >> e;
		for (int i=0; i<100; i++)
			for (int j=0; j<80; j++)
				for (int k=0; k<24; k++)
					fs >> arr3d[i][j][k];
		fs.close();
		cout << "Загрузка успешно завершена." << endl;
	}
	else
		cout << "Загрузка не удалась." << endl;

	//вывод
	cout << "Вывод загруженных значений..." << endl;
	cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << endl;
	system("pause");
	for (int i=0; i<100; i++)
		for (int j=0; j<80; j++)
			for (int k=0; k<24; k++)
				cout << arr3d[i][j][k] << ' ';

	system("pause");
	
	return 0;
}
Хм... у меня все прекрасно работает)

Последний раз редактировалось Stilet; 12.12.2010 в 13:14.
V0id вне форума Ответить с цитированием
Старый 12.12.2010, 13:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Специально симитировал условия для твоих процедур:
Код:
// gdfgf.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <fstream>

using namespace std;
int n,i,j=10;
int location[100][80][24];
void save_game ()
{
	ofstream fp ("c:\\1\\save.sav");
	for (n = 0; n < 100; n++)
	for (i = 0; i < 80; i++)
	for (j = 0; j < 24; j++)
	fp << n*i*j << " ";
	cout << "Saving complete" << endl << endl << "Press any key to quit";
	return;
}

int load_game ()
{
	ifstream fp ("c:\\1\\save.sav");
	for (n = 0; n < 100; n++)
	for (i = 0; i < 80; i++)
	for (j = 0; j < 24; j++)
	fp >> location[n][i][j];
	cout << "Loading complete" << endl << endl << "Press any key to quit";
	return n;
}

int _tmain(int argc, _TCHAR* argv[])
{
	save_game();load_game();
	getchar();
	return 0;
}
прога отработала норм.
Единственное что я использовал ofstream и ifstream
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.12.2010, 13:15   #5
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Кстати, а почему выбран именно текстовый режим? Не лучше ли числовые данные записывать в двоичном?
V0id вне форума Ответить с цитированием
Старый 12.12.2010, 13:42   #6
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Попробовал оба варианта, всё равно выводит нули.

Не получилось использовать проверку с is_open, этот самый is_open борланд у меня почему-то не принимает.

И для чего memset нужен? У меня просто memset тоже не работает.

Цитата:
Кстати, а почему выбран именно текстовый режим? Не лучше ли числовые данные записывать в двоичном?
Пожалуйста, только скажите, как это сделать, я уже не знаю сколько времени над этим всем думаю.
YourLastSong вне форума Ответить с цитированием
Старый 12.12.2010, 13:51   #7
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Может мне куда-нибудь выложить свой файл save.txt, чтобы вы проверили его загрузку через свои функции?
YourLastSong вне форума Ответить с цитированием
Старый 12.12.2010, 14:03   #8
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Цитата:
Не получилось использовать проверку с is_open, этот самый is_open борланд у меня почему-то не принимает.
Странно, я думал, стандарт един для всех))

Цитата:
И для чего memset нужен? У меня просто memset тоже не работает.
Для обнуления массива. Чтобы им пользоваться необходимо подключить заголовочный файл memory.h. В коде он нужен, чтобы сымитировать начало работы программы.

Цитата:
Пожалуйста, только скажите, как это сделать, я уже не знаю сколько времени над этим всем думаю.
ОКей. Весь код переделывать не буду, но приведу кусок для чтения/записи одного значения и массива данных.
Код:
	fs.open("save.txt", ios::out | ios::binary | ios::trunc);
	fs.write(reinterpret_cast<char*>(&a),sizeof(int));
	fs.write(reinterpret_cast<char*>(&arr3d),100*80*24*sizeof(int));
	fs.close();

	fs.open("save.txt", ios::in | ios::binary);
	fs.read(reinterpret_cast<char*>(&a),sizeof(int));
	fs.read(reinterpret_cast<char*>(&arr3d),100*80*24*sizeof(int));
	fs.close();
Цитата:
Сообщение от YourLastSong Посмотреть сообщение
Может мне куда-нибудь выложить свой файл save.txt, чтобы вы проверили его загрузку через свои функции?
Давай, но, думаю, все будет нормально.

Последний раз редактировалось V0id; 12.12.2010 в 14:10. Причина: забыл поправить функции открытия потока))
V0id вне форума Ответить с цитированием
Старый 12.12.2010, 14:42   #9
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Для reinterpret что нужно подключить?

http://rghost.ru/3577611

Это файл с пред. кода, который ты выкладывал.

Попробуй его загрузить при помощи прошлого кода, пожалуйста.
YourLastSong вне форума Ответить с цитированием
Старый 12.12.2010, 14:55   #10
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Ничего не нужно. Это стандартный C++-оператор, необходимый для того, чтобы компилятор не ругался на несовпадение типов.

Протестил... Все работает замечательно.
V0id вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение 2мерного массива из файла OpenId Общие вопросы C/C++ 2 29.11.2010 16:42
Чтение из массива Hottabych Общие вопросы Delphi 5 25.05.2009 20:18
Чтение двумерного массива из тектового файла ToxaRUS Общие вопросы C/C++ 3 15.04.2009 18:39
Чтение массива из текстового файла. Metil Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 12.01.2009 22:53
чтение из файла в два массива Frog25 Общие вопросы C/C++ 2 26.06.2008 12:15