Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Damn364
0 / 0 / 2
Регистрация: 11.03.2012
Сообщений: 32
1

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

15.11.2012, 10:15. Просмотров 2984. Ответов 11
Метки нет (Все метки)

Добрый День! При каждом проходе по циклу, старая информация стирается, а новая записывается в другой блок, как сделать чтобы старая информация оставалась в массиве и при этом массив увеличивался?

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);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 10:15
Ответы с готовыми решениями:

Расширяющийся двумерный массив
Здравствуйте. У меня никак не получается разобраться с функцией realloc. Что...

Как создать расширяющийся массив?
К примеру есть массив ( Array ) (Row = 2) и когда массив будет заполнен до...

Считывание файла в массив и запись нового файла
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100...

Считывание из файла в массив
Задание: Дан в файл в котором записана матрица вершин, необходимых для создания...

Считывание из файла в массив
Ребят, помогите Нужно считать 5 чисел из одного файла и записать сумму и...

11
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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);
1
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 10:29 3
Ваш алгоритм в кратце:
1) Выделяем память для двух символов, указатель Data ставим на начало этого блока.
2) Выделяем память для 2+i символов, указатель Data ставим на начало этого блока(при этом и старый не освобождаем)
3) Считываем в char
4) Присваиваем Data[i].
5) Увеличиваем i
6) Переходим к пункту 2.
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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;
}
1
Damn364
0 / 0 / 2
Регистрация: 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 копирует?
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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 параметром ( число байт ).
1
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.11.2012, 16:25 7
Это задача такая или Вы про std::string не в курсе?
0
Damn364
0 / 0 / 2
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 16:41  [ТС] 8
Цитата Сообщение от fasked Посмотреть сообщение
Это задача такая или Вы про std::string не в курсе?
про string в курсе, использую при необходимости, а как записать в string из файла? и обратно?
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.11.2012, 16:54 9
Цитата Сообщение от Damn364 Посмотреть сообщение
а как записать в string из файла? и обратно?
std::ifstream и std::ofstream
1
Damn364
0 / 0 / 2
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 18:42  [ТС] 10
Цитата Сообщение от fasked Посмотреть сообщение
std::ifstream и std::ofstream
А как сосчитать весь файл в одну переменную, а то он у меня считывает только одну строчку.
И еще возможен ли вариант сразу перезаписи одной строки на другую?
0
Игорь с++
473 / 465 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
15.11.2012, 19:02 11
Вам так надо что бы считывалось по символьно ? просто не проще весь файл считать в переменную , а затем уже работать с ней !?
0
Damn364
0 / 0 / 2
Регистрация: 11.03.2012
Сообщений: 32
15.11.2012, 19:09  [ТС] 12
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Вам так надо что бы считывалось по символьно ? просто не проще весь файл считать в переменную , а затем уже работать с ней !?
мне это нужно, чтобы потом найти нужную строку, и заменить уже на свою
0
15.11.2012, 19:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 19:09

Считывание из файла в массив
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

Считывание файла в массив
Здравствуйте Мне была поставлена задача сделать рандомный выбор строк из...

Считывание в массив с файла
Как считать числа из файла в массив, но сделать это со второй строки? К...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru