Форум программистов, компьютерный форум CyberForum.ru

Динамически расширяющийся массив, считывание из файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Damn364
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 10:15     Динамически расширяющийся массив, считывание из файла #1
Добрый День! При каждом проходе по циклу, старая информация стирается, а новая записывается в другой блок, как сделать чтобы старая информация оставалась в массиве и при этом массив увеличивался?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FILE *f2 = fopen("BankData.txt","rt");
        int i = 0;
        char* Data = new char[2];
            while(!feof(f2)){
                Data = new char[2+i];
                char ch = fgetc(f2);
                Data[i] = ch;
                i++;
                
            }
            cout<<Data;
            delete[] Data;
 
        fclose(f2);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
15.11.2012, 10:29     Динамически расширяющийся массив, считывание из файла #2
У Вас утечка на утечке. С каждой итерацией Вы теряете 2 + i байта. Да и каждый раз выделять память для одного символа очень накладно. Заведомо выделяйте больше памяти. Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        FILE *f2 = fopen("BankData.txt","rt");
        int i = 0;
        int size = 256;
        char* Data = new char[ 256 ];
            while(!feof(f2)){
                char ch = fgetc(f2);
                Data[i] = ch;
                i++;
                if ( i == size ) {
                   char *temp = Data;
                   Data = new char[ size * 2 ];
                   memcpy( data, temp, size );
                   size *= 2;
                }
            }
            cout<<Data;
            delete[] Data;
 
        fclose(f2);
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 10:29     Динамически расширяющийся массив, считывание из файла #3
Ваш алгоритм в кратце:
1) Выделяем память для двух символов, указатель Data ставим на начало этого блока.
2) Выделяем память для 2+i символов, указатель Data ставим на начало этого блока(при этом и старый не освобождаем)
3) Считываем в char
4) Присваиваем Data[i].
5) Увеличиваем i
6) Переходим к пункту 2.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
15.11.2012, 10:39     Динамически расширяющийся массив, считывание из файла #4
Damn364, и кстати, Вы должны понимать, что строка должна оканчиваться ноль-символом.
C++
1
2
3
Data[ i ] = '\0';
cout<<Data;
delete[] Data;
Совсем забыл удалить старый массив.
C++
1
2
3
4
5
6
7
if ( i == size ) {
   char *temp = Data;
   Data = new char[ size * 2 ];
   memcpy( data, temp, size );
   size *= 2;
   delete [] temp;
}
Damn364
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 10:56  [ТС]     Динамически расширяющийся массив, считывание из файла #5
Цитата Сообщение от Toshkarik Посмотреть сообщение
Damn364, и кстати, Вы должны понимать, что строка должна оканчиваться ноль-символом.
C++
1
2
3
Data[ i ] = '\0';
cout<<Data;
delete[] Data;
Совсем забыл удалить старый массив.
C++
1
2
3
4
5
6
7
if ( i == size ) {
   char *temp = Data;
   Data = new char[ size * 2 ];
   memcpy( data, temp, size );
   size *= 2;
   delete [] temp;
}
Спасибо за помощь, все заработало, но при этом возникло пару вопросов
1. нужно ли удалять старый Data перед созданием нового?
2. memcpy, копирует область памяти из temp в data, т.е. она и адреса на ячейки памяти старого Data копирует?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
15.11.2012, 11:31     Динамически расширяющийся массив, считывание из файла #6
Damn364, 1. Операция new возвращает указатель на выделенную область памяти. Мы в теле оператора if ( i == size )... присваиваем "старое значение" Data ( то есть адрес на выделенную ранее память ) переменной temp.
C++
1
char *temp = Data;
Теперь и temp и Data имеют одинаковое значение ( оба указателя указывают на одну и ту же область памяти ). Далее мы выделяем память размером size * 2, и присваиваем ее адрес указателю Data:
C++
1
Data = new char[ size * 2 ];
Теперь Data указывает на новую область памяти, в то время как temp указывает на старую область памяти ( в которую мы записывали данные до тех пор, пока выделенной памяти стало не хватать ). Нам нужно скопировать старые данные в новую память, что мы и делаем:
C++
1
memcpy( data, temp, size );
Теперь нужно изменить текущий размер, что бы знать, сколько памяти мы выделили:
C++
1
size *= 2;
Ну и в конце освобождаем "старую" память, на которую все еще указывает temp:
C++
1
delete [] temp;
2. memcpy всего лишь копирует содержимое памяти из области, на которую указывает второй параметр ( который является указателем ), в область, на которую указывает первый параметр ( который так же является указателем ), в количестве, указываемом 3 параметром ( число байт ).
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.11.2012, 16:25     Динамически расширяющийся массив, считывание из файла #7
Это задача такая или Вы про std::string не в курсе?
Damn364
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 16:41  [ТС]     Динамически расширяющийся массив, считывание из файла #8
Цитата Сообщение от fasked Посмотреть сообщение
Это задача такая или Вы про std::string не в курсе?
про string в курсе, использую при необходимости, а как записать в string из файла? и обратно?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.11.2012, 16:54     Динамически расширяющийся массив, считывание из файла #9
Цитата Сообщение от Damn364 Посмотреть сообщение
а как записать в string из файла? и обратно?
std::ifstream и std::ofstream
Damn364
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 18:42  [ТС]     Динамически расширяющийся массив, считывание из файла #10
Цитата Сообщение от fasked Посмотреть сообщение
std::ifstream и std::ofstream
А как сосчитать весь файл в одну переменную, а то он у меня считывает только одну строчку.
И еще возможен ли вариант сразу перезаписи одной строки на другую?
Игорь с++
 Аватар для Игорь с++
432 / 455 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
15.11.2012, 19:02     Динамически расширяющийся массив, считывание из файла #11
Вам так надо что бы считывалось по символьно ? просто не проще весь файл считать в переменную , а затем уже работать с ней !?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 19:09     Динамически расширяющийся массив, считывание из файла
Еще ссылки по теме:

C++ Построчное считывание файла txt в массив
Расширяющийся двумерный массив C++
C++ Считывание файла в массив
Считывание из файла в двумерный массив C++
Считывание из файла в массив C++

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

Или воспользуйтесь поиском по форуму:
Damn364
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 19:09  [ТС]     Динамически расширяющийся массив, считывание из файла #12
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Вам так надо что бы считывалось по символьно ? просто не проще весь файл считать в переменную , а затем уже работать с ней !?
мне это нужно, чтобы потом найти нужную строку, и заменить уже на свою
Yandex
Объявления
15.11.2012, 19:09     Динамически расширяющийся массив, считывание из файла
Ответ Создать тему
Опции темы

Текущее время: 23:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru