Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] чтение таблицы из файла 

#1  01.06.11 17:02

[C++] чтение таблицы из файла

возникла такая проблемка:
имеем файл, в котором есть неизвестное количество строк и в каждой строке некое количество чисел с плавающей точкой, причем в каждой строке количество чисел одинаково.
например такой файл:

1. 2. 3.
2. 3. 4.
3. 4. 5.
4. 5. 6.
6. 7. 8.

то есть 5 строк и по 3 числа в каждой строке.
как прочитать файл в таком формате и узнать сколько в нем было строк и "столбцов"

я сделал так:

// считаем сколько переводов строки
    std::ifstream ar("test.dat", std::ios::in|std::ios::binary);
    std::istreambuf_iterator<char> begin(ar), end;
    int counter = std::count(begin, end, char('\n') );
    ar.close();

// сохранием каждый элемент в вектор(кстати тоже надо)
    std::vector<double> v;
    std::fstream file_in ( "test.dat", std::ios::in );
    std::copy (std::istream_iterator<double>(file_in), std::istream_iterator<double>(), back_inserter(v));

// ну и вычисляем сколько было столбцов
    int counterX = v.size() / counter;


Но мне чето не очень нравится что нужно проходить по файлу два раза.
Как такое провернуть по-хитрее и по-красивее?

и тут же еще вопрос:

        CString m_sInFileText;
        //   бла бла бла как то ее заполнили
    std::basic_stringstream<wchar_t> ss(m_sInFileText.GetString());
    std::vector<double> v;
        //   теперь как вектор v заполнить тем, что лежит в ss?
        //   пробую так, но естественно не соответствие типов
    std::copy (std::istream_iterator<double>(ss), std::istream_iterator<double>(), back_inserter(v));

Исправлено Flinn (01.06.11 18:16)

Offline

#2  02.06.11 22:06

$up
Профиль

Re: [C++] чтение таблицы из файла

Не проходи два раза, ведь счётчик тебе нужен лишь для того чтобы узнать сколько столбцов...
Раз уж используешь CString, то можешь также использовать CStdioFile и его метод ReadString
далее разбиваешь строку на значения с помощью метода Tokenize, конвертируешь с помощью _ttof и засовываешь в список или вектор (по вкусу).

В итоге получается два вложенных цикла и на выходе список векторов

Offline

Программирование и БД » [C++] чтение таблицы из файла 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.299 сек.
Выполнено 14 запросов.