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

Динамические массивы разных размеров - C++

Восстановить пароль Регистрация
 
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
31.03.2013, 14:32     Динамические массивы разных размеров #1
Дан файл вида, например, такого:
9
7
5 -5 7 3 -6 9 2
1 13 6 2 -4
42 -13 3 0 5 8 -11
4 -11 3 8 -5 2 3
5 -3 9
3 5 -2 1 0 0 23
6 9 9 5 17 -13
5 3 -4 21 4 3 15
-20 5 3 -6

7 — это N — сколько координат может быть у вектора. Векторы вида x=(X1, X2, …, Xk), k<=N.
9 — это количество имеющихся векторов.
Т.е. в первой строке количество векторов, во второй — сколько может быть максимум координат, а дальше пошли сами векторы.

Мне нужно в динамический массив V размером 9 записать эти векторы; а размер каждого из субмассивов (координаты каждого вектора) равен k, где k — кол-во координат текущего вектора.
Хочу считывать строки, потом ячейке массива V присваивать массив размера = кол-ву координат.

Проблема в том, что не знаю, как объяснить, что у нас строка закончилась. Пробовал метод get у входного потока (типа while read.get()!="\n") — не подходит, т.к. у нас числа, а этот get знак минуса отдельно хавает.

Добавлено через 11 минут
В принципе, сколько векторов — неважно... напишу while (!read.eof()) и всё. Главное — чтобы можно было при переходе на следующую строку:
1) узнать, сколько в ней чисел (k штук)
2) ячейке массива векторов присвоить динамический массив размера k.
3) и заполнить его числами этими (координатами).

Нельзя использовать vector, set и т.п... реализовать нужно всё строго через динам. массивы (просто само задание на ссылочный тип данных).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 14:32     Динамические массивы разных размеров
Посмотрите здесь:

Динамические массивы. C++
Динамические массивы C++
C++ Динамические массивы
C++ динамические массивы
C++ Динамические массивы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
31.03.2013, 14:37     Динамические массивы разных размеров #2
Вы через потоки читаете? Т. е. ifstream
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:39     Динамические массивы разных размеров #3
считывать числа построчно
C++
1
getline(ifst,str);
разбивать строки на составляющие цифры через istringstream например
C++
1
2
3
4
5
6
7
8
9
#include <sstream>
istringstream iss(str)
while(iss)
{
 
    int temp;
    iss >> temp;
    //добавить в i-ый элемент вытащенное число temp
}
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
03.04.2013, 04:59  [ТС]     Динамические массивы разных размеров #4
Tiva, спасибо большое; то, что нужно. Почти.
Вопрос ещё в том, как узнать, сколько чисел в строке. Ну вот сгетлайнил, и мне нужно же создать массив определенного размера (k чисел) — как получить k?

Добавлено через 4 часа 28 минут
Есть способ?

Добавлено через 8 часов 49 минут
? [поднимаю]
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.04.2013, 05:20     Динамические массивы разных размеров #5
Цитата Сообщение от Delmellor Посмотреть сообщение
Динамические массивы разных размеров
А зачем размер упомянут? Динамический массив по определению есть массив, не определяющий своего размера в момент декларации и получающий его в рантайме по потребности. А потребность в размерах нескольких массивов в общем случае может не совпадать. Или в данном случае речь о неравенстве верхней планки, типа один массив имеет
C++
1
uint8_t count;
, у второго
C++
1
uint16_t count;
, у третьего
C++
1
uint32_t count;
, а у четвёртого
C++
1
size_t count;
?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2013, 06:51     Динамические массивы разных размеров #6
Как вариант. Выведет количество чисел, расположенных через пробел, в каждой строке файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ifstream fin("2.txt");
int N = 0;
while (fin.peek() != EOF)
{
    int temp;
    fin >> temp;
    ++N;
    if (fin.peek() == '\n' || fin.peek() == EOF)
    {
        cout << N << endl;
        N = 0;
    }
}
Добавлено через 12 минут
Или способом, который предложил Tiva, но с подсчётом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (!fin.eof())
{
    string str;
    getline(fin, str);
    istringstream iss(str);
        
    int N = 0;
    while(iss)
    {
        int temp;
        iss >> temp;
        if (iss)
        ++N;
    }
    cout << N << endl;
}
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
09.04.2013, 15:09  [ТС]     Динамические массивы разных размеров #7
Эх...
Мне нужно вот что:
Узнавать, сколько в строке чисел, потом "тут же, не считывая их", объявлять массив этого размера, а уже потом в него их заносить. Т.е. чтобы можно было написать цикл for (i=0; i<K; i++) fin>>А[i] ;; у А размер K, который мы уже узнали.
Т.е. всё сводится к тому, чтобы как-то "вернуться назад" после подсчёта количества чисел в строке.
И в массиве этом созданном должно быть ровно K элементов — ни больше, ни меньше.

Добавлено через 12 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем размер упомянут? Динамический массив по определению есть массив, не определяющий своего размера в момент декларации и получающий его в рантайме по потребности. А потребность в размерах нескольких массивов в общем случае может не совпадать. Или в данном случае речь о неравенстве верхней планки
Да, речь о неравенстве верхней планки.
Цитата Сообщение от taras atavin Посмотреть сообщение
получающий его в рантайме по потребности
Именно так всё и должно произойти — узнаём верхнюю планку, создаём массив длины K, заполняем его значениями из строки с K значениями.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 15:17     Динамические массивы разных размеров #8
Цитата Сообщение от Delmellor Посмотреть сообщение
Узнавать, сколько в строке чисел, потом "тут же, не считывая их", объявлять массив этого размера, а уже потом в него их заносить.
Это нужно делать для каждой строки в файле?

Добавлено через 6 минут
Если да, то файл всё равно придётся два раза проходить. Поэтому, создаёте вектор интов, проходите файл, как описано выше, количество чисел в каждой строке помещаете в вектор, закрываете файл (или перемещаете курсор в начало), снова открываете, берёте последовательно числа из вектора, создаёте массивы нужного размера, читаете туда числа из строк (сколько из в каждой строке уже будете знать).
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
09.04.2013, 15:27  [ТС]     Динамические массивы разных размеров #9
Спасибо, то, что нужно.

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
или перемещаете курсор в начало
Как это сделать?

В принципе, не знаю и того, как "заново открыть файл" — ещё раз объявить переменную ifstream?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 16:43     Динамические массивы разных размеров
Еще ссылки по теме:

Динамические массивы C++
C++ Динамические массивы
Динамические массивы C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 16:43     Динамические массивы разных размеров #10
Цитата Сообщение от Delmellor Посмотреть сообщение
Как это сделать?
C++
1
2
fin.clear();
fin.seekg(0);
Добавлено через 3 минуты
Размер вектора с интами, будет равен количеству строк в файле, поэтому второй раз можно читать не до конца файла, а в цикле (так проще).
Yandex
Объявления
09.04.2013, 16:43     Динамические массивы разных размеров
Ответ Создать тему
Опции темы

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