Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись/чтение в файл огромного массива int, ошибки переполнения стека  
V
    Опции темы
v_enom
Дата 13.10.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



Люди, пожалуйста, помогите.

мне нужно записать двумерный массив из 1000x1000 элементов (int) в файл.
если я записываю массив 100х100 то все нормально записывается, если больше: 1000 х 1000 то вылезают ошибки, перегрузка стека и т.д.




Код


  char *file_name;
  

  file_name= "StreamTest.bin";

  ifstream fin(file_name,ios::in|ios::binary);
  fin.close();
  ofstream fout(file_name,ios::out|ios::binary|ios::trunc);
  fout.close();

//    int i=128;                       при такой записи получаем
//   to_file<<i;                     в файле значения ASCII  цифр 1,2,3

           const  int N=1000;

 int mas[N][N];            // записываемый массив
 int a[N][N];                 // массив, куда будут считываться данные


 for (int i=0;i<N;i++)
 for (int j=0;j<N;j++)      
 {mas[i][j]=0;
  a[i][j]=0;                                   // обнуление 


 }        //записываем массив

int l=1;                 // значения  массива


  fout.open(file_name);

 for (int i=0;i<N;i++)
 {

   for(int j=0;j<N;j++)
    {
     mas[i][j]=l; l++;
     fout.write((char*)&mas[i][j],4);   // записываем в файл
     }

 }

 fout.close();

fin.open(file_name);

//---------------------------------- ЧИТАЕМ 

for (int i=0;i<N;i++)
 {

   for(int j=0;j<N;j++)
    {
   fin.read((char*)&a[i][j],4);                           
    }
}

 fin.close();
//getch();

        return 0;
}




а при считывании из файла первые 25 элементов считываются в массив a[i][j]   записываются, а потом перестают записываться...


может быть я не теми функциями пользуюсь или есть какие-то ограничения. Что мне делать?

Это сообщение отредактировал(а) v_enom - 14.10.2007, 00:17
PM MAIL   Вверх
v_enom
Дата 14.10.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



провобал еще вот так с фунцкией fwrite:

Код


     const int N=1000000;

   int s[N];
   for(int i=0;i<N;i++)
      s[i]=0;

   int k=0;

   for(int i=0;i<N;i++)
    {
    s[i]=k;
     k++;
   fwrite(&s[i], 4, 1, stream); /* write  to file */
   }



но работает только до 100 000 элементов ((
сообщение следующее:

Project stream.exe rised exaption class  EStackOverflow with message "Stack Overflow". Process stoped


PM MAIL   Вверх
DjoNIK
Дата 14.10.2007, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Если "Stack Overflow", то просто делаешь функцию, которая записывает, допустим, сто элементов. Затем вызываешь ее в цикле.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
zkv
Дата 14.10.2007, 01:22 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Проблема в этом:
Цитата(MSDN)

The default stack size is 1 MB.

Можно увеличить размер стека в настройках проекта, но лучше над стеком не издеваться такими объемами, а работать с динамической памятью (new/delete), как - примеров на форуме хватает.
PM MAIL   Вверх
v_enom
Дата 14.10.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



со стеком понял, а что с чтением делать??? 
я заметил что если я пишу двумерный массив mas[10][10], например, то после элемента mas[0][9] в файле появляется еще какой-то укзатель или фиг знает что. а только потом содержание фала... 
с одномерным все окей. 
PM MAIL   Вверх
v_enom
Дата 14.10.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



или вот такая проблема (уже динмаический созданный массив)

читае с 100 ... по 25 элемент и выводит на экран нормально, а с 24 по 1 выводит нули.А в файле все как надо


вот так писал:
Код


int k=N*N;
   for(int i=0;i<N;i++)
      for(int j=0;j<N;j++)
      {
       s[i][j]=k;
        k--;
        fwrite(&s[i][j], 4, 1, stream); /* write struct s to file */
      }
   fclose(stream); /* close file */





а так читаю.

Код

 stream = fopen("TEST.bin", "r");

   for(int i=0;i<N;i++)
      for(int j=0;j<N;j++)
      {
        fread(&r[i][j], 4, 1, stream); /* write struct s to file */
        k=k+1;
      }



эффект этот на любом массиве больше чем 3х3  но в конце либо 0 либо какая-то ерунда

Очень прошу помочь,  в других источниках не могу найти ответа


пробовал сейчас записать в файл несколько раз подряд число 13 (0х0D)
вот в нем оказывается и проблема...записывает нормально, а читает с каким-то смещением....
проблема именно в этом


Это сообщение отредактировал(а) v_enom - 14.10.2007, 12:53
PM MAIL   Вверх
v_enom
Дата 14.10.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



вот что в памяти у меня.. при N = 5

а на выходе результата числа:  25 24 23 22 21
                                                    20 19 18 17 16
                                                    15  14  201326592  184549376.....16777216   0



Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  far.GIF 7,19 Kb
PM MAIL   Вверх
v_enom
Дата 14.10.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



сделал для себя вывод, что лучше не юзать потоки. пользуясь обыными функциями write и read(handl,size,len)....
с ними работает
PM MAIL   Вверх
xvr
Дата 15.10.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(v_enom @ 14.10.2007,  11:04)
или вот такая проблема (уже динмаический созданный массив)

читае с 100 ... по 25 элемент и выводит на экран нормально, а с 24 по 1 выводит нули.А в файле все как надо


Код

 stream = fopen("TEST.bin", "r");



пробовал сейчас записать в файл несколько раз подряд число 13 (0х0D)
вот в нем оказывается и проблема...записывает нормально, а читает с каким-то смещением....
проблема именно в этом

У тебя файл открывается в текстовом режиме, при этом библиотека при выводе каждого символа '\n' приписывает перед ним '\r', при вводе наоборот - удаляет. Создавай/открывай файлы в бинарном режиме (запись - "wb", чтение - "rb") и будет все Ок

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.