1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
||||||||||||||||
1 | ||||||||||||||||
Чтение массива из файла12.12.2010, 01:22. Показов 4830. Ответов 17
Метки нет (Все метки)
Здравствуйте, господа.
Заранее извиняюсь за то, что задаю, скорее всего, не самый умный вопрос на этом форуме и за то, что такая тема уже, возможно, тут когда-либо присутствовала, однако стоит отметить, что поиском я пользоваться всё же пытался. Если у вас есть время прочитать о том, что у меня не получается сделать, буду очень признателен. Мне необходимо сделать две функции - записи данных в файл и чтения их из него. Для записи у меня 5 целочисленных переменных (назовём их, например, value_1 - value_5), а также трёхмерный массив int huge a1 [100][80][24]. Функция записи в файл у меня выглядит след. образом:
Создание файла и сохранение абсолютно всех переменных осуществляется прекрасно. Если сменить расширение файла, который мы создаём, на .txt, то можно даже узнать, что сохраняются именно те значения, которые надо. Проблема в том, что читаются лишь некоторые переменные - точнее, только первые из них. Сначала я думал, что дело в том, что я не так использовал fstream. Когда я попробовал использовать fprintf и fscanf, то проблема всё равно осталась. Потом я решил, что дело в цикле for - попробовал использовать некоторые другие способы. Разумеется, это тоже не помогло. Для проверки, что же в итоге происходит со значениями, которые не читает из файла, я написал вот такое и увидел, что все значения он показывает как нули:
Заранее благодарю за возможные ответы.
0
|
12.12.2010, 01:22 | |
Ответы с готовыми решениями:
17
Чтение массива из файла Чтение массива из файла Чтение из файла массива Чтение массива из файла |
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
12.12.2010, 05:15 | 2 |
Вообще по этому оператору программа завершает свою работу.
Учитывая вышенаписанное до реторна дело никогда не дойдет, к тому же реторн может возвращать только одно значение. Оно то конечно хорошо, но полагаться на то, что файл всегда будет содержать правильные данные в нужном количестве не стоит. Лучше проверять флаги состояние потока после чтения. Для этого есть 3 функции: fstream::eof(); - возвращает 1, если достигли конца файла; fstream::fail(); - возвращает 1, если по каким-либо причинам не смогли прочитать данные, но в потоке остались данные доступные для чтения; fstream::bad(); - возвращает 1, если по каким-либо причинам данные не были считаны и дальнейшее чтение не возможно. Если один из этих флагов будет установлен, дальнейшая работа с потоком будет не вожможна до сброса всех флагов функцией fstream::clear();
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 12:37 [ТС] | 3 |
Просто с этими флагами ни разу не работал. И будет ли всё это работать в борланде? Добавлено через 1 час 22 минуты Выдаётся ошибка: Код
fp >> location [n][i][j]
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
||||||
12.12.2010, 14:34 | 4 | |||||
Сразу не обратил внимание, тип fstream используется для открытия файлов для чтения\записи, по умолчанию файл открывается в режиме ios::in|ios::out, и если файл с таким именем уже существует, то он удаляется. Если требуется прочитать существующий файл, то нужно использовать режим ios::in|ios::out|ios::app (чтение произвольно, запись в конец файла) или ios::in|ios::out|ios::ate (и чтение и запись произвольно по файлу). Или же, раз чтение и запись разнесены по отдельным функциям, использовать типы ifstream и ofstream соответственно.
Что-то вроде этого
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 14:45 [ТС] | 5 |
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
12.12.2010, 14:50 | 6 |
Значит были какие-то исправления в коде?
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 14:56 [ТС] | 7 |
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
12.12.2010, 15:09 | 8 |
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 15:11 [ТС] | 9 |
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
12.12.2010, 15:17 | 10 |
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 15:31 [ТС] | 11 |
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
12.12.2010, 15:37 | 12 |
Судя по всему оператор взять из потока >> с таким типом работать не умеет. Можно попробовать завести int'овую переменную, читать из файла в нее, а потом приравнивать ее элементу массива.
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 15:48 [ТС] | 13 |
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
||||||
12.12.2010, 15:58 | 14 | |||||
Я понял, я имею ввиду такую конструкцию
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 16:20 [ТС] | 15 |
В общем, я решил записывать данные в файл location [100][80][24], а вот для считывания из файла сделал массив типа int location1 [50][40][12].
Код
int location1[50][40][12]; int huge location[100][80][24]; void load_game () { ifstream fp; fp.open ("save.txt", ios::in); fp >> n >> load_map >> local_pos >> map_locations >> start_map; cout << n << load_map << local_pos << map_locations << start_map; getch (); local_map_value = n; for (n = 0; n < 50; n++) for (i = 0; i < 40; i++) for (j = 0; j < 12; j++) fp >> location1[n][i][j]; for (n = 0; n < 50; n++) for (i = 0; i < 40; i++) for (j = 0; j < 12; j++) location[n][i][j] = location1[n][i][j]; for (n = 50; n < 100; n++) for (i = 40; i < 80; i++) for (j = 12; j < 24; j++) fp >> location1[n-50][i-40][j-12]; for (n = 50; n < 100; n++) for (i = 40; i < 80; i++) for (j = 12; j < 24; j++) location[n][i][j] = location1[n-50][i-40][j-12]; for (n = 0; n < 100; n++) { for (i = 0; i < 80; i++) { for (j = 0; j < 24; j++) { cout << location[n][i][j]; } } } n = local_map_value; cout << "Loading complete" << endl << endl << "Press any key to quit"; getch (); } void save_game () { ofstream fp; fp.open ("save.txt", 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] << " "; location1[n-50][i-40][j-12] = location[n][i][j]; cout << "Saving complete" << endl << endl << "Press any key to quit"; getch (); exit (EXIT_SUCCESS); } Что тут можно исправить, чтобы всё выводилось?
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
||||||
12.12.2010, 16:36 | 16 | |||||
Ээ... всетаки использовать в качестве буфера целый массив довольно накладно.
0
|
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
|
|
12.12.2010, 17:04 [ТС] | 17 |
Спасибо.
Кстати, давно уже хотел узнать - есть ли какие-либо функции для изменения заголовка окна консоли и для того, чтобы убрать мигающий курсор в консоли?
0
|
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|||||||||||
13.12.2010, 12:11 | 18 | ||||||||||
В conio.h есть функция
0
|
13.12.2010, 12:11 | |
13.12.2010, 12:11 | |
Помогаю со студенческими работами здесь
18
Чтение массива из файла Чтение массива из файла Чтение двухмерного массива из файла Чтение массива структур из файла чтение числового массива из файла Чтение массива чисел из файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |