Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 33
1

Cохранение очень большого массива в текстовый файл

18.08.2014, 20:46. Показов 1199. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста. Мне требуется сохранить карту в своей игре в текстовый файл. Класс карты:
C++
1
2
3
4
5
6
7
8
9
10
11
class cMap
{
     public:
          cRegion regions[100][100];
};
 
class cRegion
{
     public:
          int blocks[50][50][5];
};
Подскажите наиболее хороший способ.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2014, 20:46
Ответы с готовыми решениями:

Создания ну очень большого массива
Нужно создать массив состоящий из 1 000 000 целых чисел в диапазоне для дальнейший сортировке....

Создание очень большого двумерного массива
Здравствуйте! Возникла проблема. Нужно создать ну просто очень большой двумерный массив, примерно...

Тип данных для очень большого массива
Есть массив где больше четырех миллионов элементов int massiv={0}; когда так пишу программа...

Вывод большого числа знаков после запятой в текстовый файл
Всем привет! Нужно что бы в текстовый файл записывалось 48 знаков после запятой, а записывает...

14
 Аватар для dimabubyakin
161 / 122 / 85
Регистрация: 16.10.2013
Сообщений: 1,738
18.08.2014, 20:55 2
Evgenii32rus, хм.. а чем вас обычная запись в файл не устраивает?
К примеру в двоичный затолкать...
0
 Аватар для Vaiz
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
18.08.2014, 20:56 3
Evgenii32rus, мне кажется тут ничего особого не придумаешь, хранить как обычный массив. Если размер не постоянный, то первые числа в файле - размер массива.
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
18.08.2014, 21:05 4
Сохранение больших массивов чисел в текстовый файл - плохая идея, особенно если это float/double. Мало того, что требуется много времени на преобразование числа в строку и обратно, так ещё тебе никто не гарантирует, что ты получишь тоже число. Для таких задач есть тот же BSON

Добавлено через 3 минуты
З.Ы.: Нашёл в загашниках ссылочку http://leopard.in.ua/2013/10/1... n-formats/
0
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 33
18.08.2014, 21:18  [ТС] 5
Я пытался использовать такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void SaveMap(cMap& Map)
{
    for(int i = 0; i < 100; i++)
    {
        for(int j = 0; j < 100; j++)
        {
             SaveRegion(Map.regions[i][j], i, j);
        }
    }
}
 
void SaveRegion(cRegion& Region, int x, int y)
{
    for(int i = 0; i < 50; i++)
    {
        for(int j = 0; j < 50; j++)
        {
              for(int k = 0; k < 5; k++)
              {
                    char xPos[3];
                    char yPos[3];
                    wsprintf(xPos, "%d", x);
                    wsprintf(yPos, "%d", y);
                    string fileName;
                    fileName.append(xPos); fileName.append("_"); fileName.append(yPos); fileName.append(".txt");
                    FILE* file;
                    file = fopen(fileName.data(), "w");
                    fwrite((void*)&Region.blocks[i][j][k], sizeof(int), 1, file);
                    fclose(file);
              }
        }
    }
}
Но в файл записываются только непонятные символы.
0
 Аватар для Vaiz
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
18.08.2014, 21:45 6
Цитата Сообщение от AlexVRud Посмотреть сообщение
Сохранение больших массивов чисел в текстовый файл - плохая идея, особенно если это float/double. Мало того, что требуется много времени на преобразование числа в строку и обратно, так ещё тебе никто не гарантирует, что ты получишь тоже число. Для таких задач есть тот же BSON
Добавлено через 3 минуты
З.Ы.: Нашёл в загашниках ссылочку http://leopard.in.ua/2013/10/1... n-formats/
А как организовывать логику: самостоятельно все прописывать или уже есть готовые библиотеки?

Добавлено через 6 минут
C++
1
2
3
file = fopen(fileName.data(), "w");
fwrite((void*)&Region.blocks[i][j][k], sizeof(int), 1, file);
fclose(file);
fwrite как раз вроде записывает в бинарном виде. Ну и фрагмент выше наверное был бы правильнее в таком виде без цикла по k.
C++
1
2
3
file = fopen(fileName.data(), "w");
fwrite((void*)Region.blocks[i][j], sizeof(int), 5, file);
fclose(file);
Добавлено через 4 минуты
И чуть не забыл, открывайте файл один раз до начала всех циклов, а то мне кажется у вас он каждый раз заново создается и все прошлое содержимое стирается. Или уж открывайте в режиме "a", а не "w"

Добавлено через 9 минут
А вообще наверное вы хотели что-то вроде такого.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void SaveRegion(cRegion& Region, int x, int y)
{
    char xPos[3];
    char yPos[3];
    wsprintf(xPos, "%d", x);
    wsprintf(yPos, "%d", y);
    string fileName;
    fileName.append(xPos); fileName.append("_"); fileName.append(yPos); fileName.append(".txt");    
    FILE* file;
    file = fopen(fileName.data(), "w");
    for(int i = 0; i < 50; i++)
    {
        for(int j = 0; j < 50; j++)
        {
              for(int k = 0; k < 5; k++)
              {
                    fprintf(file, "%d ",Region.blocks[i][j][k]);
              }
              fprintf(file, "\n");
        }
    }
    fclose(file);
}
1
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
18.08.2014, 21:59 7
Цитата Сообщение от Vaiz Посмотреть сообщение
fwrite((void*)&Region.blocks[i][j][k], sizeof(int), 1, file)
И тут у тебя большой подводный камень. Размер int зависит от компилятора, ОС и её разрядности.

Поэтому предложенные выше библиотеки и более выгодны, т.к. решают часть очень важных проблем.

Ну а если хочется именно текстовый файл, то используй stringstream, для оптимизации записи.
1
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 33
19.08.2014, 19:29  [ТС] 8
Почему при выполнении этого кода возникает ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void SaveWorld(d3dFrameWork FrameWork, cMap Map)
{
    for(int i = 0; i < 50; i++)
    {
        for(int j = 0; j < 50; j++)
        {
            SaveRegion(Map, i, j);
        }
    }
}
 
void SaveRegion(cMap Map, int x, int y)
{
    FILE* f;
    char xPos[3]; char yPos[3];
    wsprintf(xPos, "%d", x); wsprintf(yPos, "%d", y);
    std::string filename;
    filename.append("Res//data//"); filename.append(xPos); filename.append("_"); filename.append(yPos); filename.append(".txt");
    f = fopen(filename.data(), "w");
    for(int i = 0; i < 50; i++)
    {
        for(int j = 0; j < 50; j++)
        {
            for(int k = 0; k < 5; k++)
            {
                fprintf(f, "%d", Map.regions[x][y].blockLayers[i][j][k]);
                fprintf(f, "%s", ",");
            }
        }
    }
    fclose(f);
}
Миниатюры
Cохранение очень большого массива в текстовый файл  
0
 Аватар для Vaiz
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
19.08.2014, 20:00 9
Evgenii32rus, это похоже на выход за пределы массива, но так просто трудно сказать где это.
Попробуйте поймать на каких значениях [x][y][i][j][k] происходит вылет. Для начала во всех циклах можно поставить по 1, т.е. for(int i = 0; i < 1; i++)

Добавлено через 1 минуту
а вообще у вас наверно в файлах это видно, по крайней мере какой последний файл был создан.
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
19.08.2014, 20:46 10
Цитата Сообщение от Evgenii32rus Посмотреть сообщение
Но в файл записываются только непонятные символы.
Evgenii32rus, если написать
C++
1
2
    int d = 0x1234;
    fwrite((void*)&d, sizeof(int), 1, file);
то в файл будут выведены байты: 0x34 и 0x12. Т.е. содержимое памяти по адресу &d.

Добавлено через 2 минуты
Цитата Сообщение от Evgenii32rus Посмотреть сообщение
Почему при выполнении этого кода возникает ошибка?
Чтобы определить почему, стоит определить (с помощью отладчика), в какой строке возникает ошибка.
0
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 33
19.08.2014, 20:52  [ТС] 11
Если передовать объект Map по ссылке, то ошибки не вознекает, но в файл записываются беспорядочные числа.
C++
1
void SaveMap(cMap& Map)
Пробовал подставлять конкретное число вместо Map.regions[x][y].blockLayers[i][j][k]. Запись выполняется правильно.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
19.08.2014, 21:09 12
Цитата Сообщение от Evgenii32rus Посмотреть сообщение
C++
1
void SaveWorld(d3dFrameWork FrameWork, cMap Map)
Evgenii32rus, какой размер у Вас имеет переменная Map ? Evgenii32rus, понятно ли Вам, в чём отличие таких функций?
C++
1
2
3
void f1(cMap a );
void f2(cMap& b );
void f3(cMap* p );
Добавлено через 16 минут
Цитата Сообщение от Evgenii32rus Посмотреть сообщение
в файл записываются беспорядочные числа
Evgenii32rus, как Вы определили, что числа - беспорядочные? Может быть, это и есть числа Map.regions[x][y].blockLayers[i][j][k]).

Цитата Сообщение от Evgenii32rus Посмотреть сообщение
Запись выполняется правильно
0
 Аватар для orange_fox
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
19.08.2014, 23:46 13
А можно как-то memcpy всего объекта "сделать" в бинарный файл?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
20.08.2014, 07:46 14
WriteFile function

Windows Server 2003 and Windows XP: Pipe write operations across a network are limited in size per write. The amount varies per platform. For x86 platforms it's 63.97 MB. For x64 platforms it's 31.97 MB. For Itanium it's 63.95 MB.
0
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 33
20.08.2014, 21:07  [ТС] 15
Этот код работает правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
bool SaveInteger(FILE* file, int num, bool needPoints)
{
    char cNum[4] = {0};
    wsprintf(cNum, "%d", num);
    if(fwrite((void*)cNum, sizeof(cNum), 1, file) > 0)
    {
        if(needPoints)
        {
            char p[2] = {"."};
            fwrite((void*)p, sizeof(p), 1, file);
        }
        return true;
    }
    else
    {
        return false;
    }
}
 
bool cMap::SaveWorld()
{
    for(int i = 0; i < 50; i++)
    {
        for(int j = 0; j < 50; j++)
        {
            FILE* file;
            std::string fileName;
            char xPos[3]; char yPos[3];
            wsprintf(xPos, "%d", i); wsprintf(yPos, "%d", j);
            fileName.append("data//"); fileName.append(xPos); fileName.append("_"); fileName.append(yPos), fileName.append(".txt");
            file = fopen(fileName.data(), "w");
 
            for(int i2 = 0; i2 < 50; i2++)
            {
                for(int j2= 0; j2 < 50; j2++)
                {
                    for(int k2 = 0; k2 < 5; k2++)
                    {
                        int id = regions[i][j].blockLayers[i2][j2][k2];
                        if(!SaveInteger(file, id, true))
                        {
                            return false;
                        }
                    }
                }
                }
 
                        fclose(file);
            }
       }
 
return true;
}
0
20.08.2014, 21:07
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2014, 21:07
Помогаю со студенческими работами здесь

Cохранение каталога в файл
у меня есть каталог int age = {17,24}; я хочу его сохранить и пишу for(int i = 0;i &lt; 2;i++)...

Arduino (Processing). Cохранение в файл
добрый день ,подскажите у меня через цифровой порт ардуино мега 2560 считываются данные int...

Cохранение введенных данных в файл
Привет всем. Помогите написаит программу на паскале , которая будет сохранять в текстовом документе...

Задача с использованием структуры «текстовый файл» (в файле хранится текст) 1) Переписать в другой текстовый файл самую
Задача с использованием структуры «текстовый файл» (в файле хранится текст) 1) Переписать в другой...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
Объекты и их имена
hw_wired 28.01.2025
Введение: Основы объектного подхода и их роль в информатике В современном мире информационных технологий объектный подход стал фундаментальным принципом организации и обработки информации. Этот. . .
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru