crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Чтение массива из текстового файла
Гость_IvanKa_*
сообщение 6.4.2012, 11:31
Сообщение #1





Гости








    


Подскажите как проще всего (лучше и быстрее) прочитать массив флотов из текстового файла?

Флоты могут быть как "1", "1.0", "1.0е1" (без ковычек) а между ними пробел(ы), таб(ы), пустые строки (а может просто 1 пробел, а может просто конец строки)

нашёл как это на паскале делается с seekeof и всё такое... но кажется на c++ както получше это можно реализовать.

ЗЗЫ регулярные выражения не предлагать.

ЗЗЗЫ кол-во элементов известно. к примеру при начале чтения я знаю что в файле массив 7*5000000 (тоесть 7 массивов, в каждом по 5 миллионов флотов)..

ЗЗЗЫ строки могут быть разной длины.

пример:

Раскрывающийся текст

1 6
2.32е2

3 9.66 55.2 434.4543543543е22







232
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.4.2012, 12:35
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


читать построчно и дальше sscanf-ом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 6.4.2012, 14:10
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Думаю, оптимальным было бы (при относительно больших файлах) читать файл целиком в текстовый стрим и оттуда заполнят значениями то что требуется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_IvanKa_*
сообщение 6.4.2012, 14:54
Сообщение #4





Гости








    


Цитата(Iron Bug @ 6.4.2012, 12:35) *
читать построчно и дальше sscanf-ом.


дык формат строки не постоянен. как там шаблон записать? не прокатит...

вот когда там "пять интегеров через пробел в каждой строке" тогда понятно: fscanf(fd,"%d %d %d %d %d", i[1],i[2],i[3],i[4],i[5])

а когда строки не шаблонные?...

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.4.2012, 17:06
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


пример разбора строки.
Раскрывающийся текст
#include "stdlib.h"
#include <cstdio>

using namespace std;

int main()
{
        const char buffer[] = "1.2 566    5566.4";
        const char *poffset = buffer;
        float value;
        int length = 0;
        int pos = 0;
        while(true) {
                pos = sscanf(poffset,"%f%n",&value,&length);
                if(pos == EOF)
                    break;
                poffset += length;
                printf("%f\n",value);

        }
        return 0;
}

правда, тут нужно уточнить, все ли компиляторы читают %n как количество считанных символов. но вроде все должны читать.

Сообщение отредактировал Iron Bug - 6.4.2012, 17:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 29.4.2012, 18:38
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


можно попробовать с помощью istream_iterator или istreambuf_iterator
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 0:39