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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчёт числа столбцов, lim -> maximus elegantus 
:(
    Опции темы
W4FhLF
Дата 6.7.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Есть такой файл:

Цитата

    0     0    -1.87
  25     0    -1.83
  50  0  -1.8
    75  0  -1.78


Известно, что кол-во чисел в каждой строке постоянно. Отступов(tab, space) может быть сколько угодно. 

Т.к. кол-во столбцов в файле << кол-ва строк, а общее число столбцов и строк заранее неизвестно, файл описывается такой структурой:

Код

typedef vector < vector< double >* > VecTable;


т.е. каждый столбец - отдельный вектор.

Задача: рассчитать кол-во необходимых столбцов, выделить память и заполнить массив. 

С выделением памяти и заполнение всё понятно. Рассчёт кол-ва столбцов реализовал следующим образом:

Код

using namespace std;
typedef vector < vector< double >* > VecTable;

void read_txt(string& path, VecTable& vector_table)
{
    ifstream data_file(path.c_str());
    if (data_file.fail())
        throw ios::failure("Can't open file. Make sure the file existing and accessing.");
    
    // Подсчёт столбцов, выделение памяти.
    string s;
    getline(data_file, s);
    istringstream stream(s);
    
    for (istream_iterator<double> it = stream; it != istream_iterator<double>(); ++it)
        vector_table.push_back(new vector<double>());

    data_file.seekg(ios::beg);
...
// заполнение массива
...
}  


Глядя на код не получаю морального удовлетворения smile, т.к. использование 2х временных объектов и фокусы с потоковым указателем в этом коде смотрятся словно лишний костыль. Напрашивается выделение этого функционала в отдельный метод, так и сделаю, если кто-нибудь из форумчан не предложит более элегантный способ решения этой небольшой задачки. STL и boost приветствуются. 

Это сообщение отредактировал(а) W4FhLF - 6.7.2008, 12:14


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
jonie
Дата 6.7.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



а почему бы не 
Код

typedef vector<vector<double>> VecTable;
и если стобцов количество постоянное, то можно сразу приступать к заполнению, и забить на высчитывание нужного количества. т.е. нечто вроде:
Код

    string s;
    while(getline(inf, s))
    {
        vector_table.push_back(vector<double>());
        double d;
        while(extractDouble(s,d))
        {
            vector_table.back().push_back(d);
        }
    }



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
W4FhLF
Дата 6.7.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



jonie, ну у тебя для каждой строки выделяется вектор, а у меня наоборот - каждый столбец это отдельный вектор. В случае:

Цитата(W4FhLF @  6.7.2008,  12:10 Найти цитируемый пост)
кол-во столбцов в файле << кол-ва строк


плодить столько объектов не очень-то рационально(например сейчас в файле кол-во столбцов 3, а строк 10 000). Функция extractDouble в любом случае потребует прохождения по всей строке. В общем, кода придётся писать не меньше, а ресурсов он сожрёт больше smile





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
JackYF
Дата 6.7.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Решение вполне неплохое, по мне.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
jonie
Дата 6.7.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



W4FhLF я невнимателен)
ни как минимум ...
Код

data_file.seekg(ios::beg);
это можно убрать, если сразу вносить данные в только что созданный vector:
Код

    for (istream_iterator<double> it = stream; it != istream_iterator<double>(); ++it) {
        vector_table.push_back(new vector<double>());
        vector_table.back()->push_back(*it);
    }
если я, конечно, не туплю нигде)
ну а далее дочитывать...

конечно, можно вообще всех запутать, сделав все на старом добром..
Код

const char* p = s.c_str();
char* p_end = const_cast<char*>(s.c_str())+s.size();
char* p_end_t = 0;

//parse line
while(p_end>p_end_t){
  p_end_t = p_end;
  double d = strtod(p,&p_end_t);
  p = p_end_t;
  cout<<d<<'\t';
}
писал тут, так что извиняйте за ошибки...

а если строки заканчиваются без пробела, то пойдет и такое:
Код

while(true) {
  double d;
  inf>>d;
  if(inf.fail()) break;
  push_back_here
  if (inf.peek()=='\n')
   next_line_is_new_line
}

это в тему "мне не нравится создание временных обхектов"... выбора дофига.
-------------
вообще есть boost::spirit... это чтоб вообще никто не понял че делает код 8-)

но имхо так не стоит извращаться) стоит сделать так чтобы это было понятно не только тебе..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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