C ++ Чтение в текстовом файле в массив vec4 - PullRequest
0 голосов
/ 12 января 2012

Я знаю, что существует довольно много вопросов, связанных с текстом в массив, но мне трудно сопоставить их с моими.

Я не очень хорош в C ++, но мне нужно использовать его для своихПрограммирование OpenGl.

По сути, я создал массив vec4 (vec4 - это всего лишь 4 "точки" для системы координат), а затем распечатал их в текстовый файл.Файл выглядит следующим образом (я исключил последний пункт, потому что это ВСЕГДА 1, и я решил добавить его при чтении текстового файла позже):

( 0.26, 0385, 0.48 )

( 0.27, 0386, 0.47 )

( 0.28, 0387, 0.46 )

( 0.29, 0388, 0.45 )

Таким образом, каждая строка отделяется одним концом;

Теперь я хочу прочитать этот текстовый файл и превратить его в массив vec4.Какой самый простой способ сделать это, избегая '(', ',' и ')'?Я мог бы, вероятно, написать огромный длинный вложенный if / else, чтобы отсеять этих нежелательных символов, но это было бы весьма неэффективно, и я уверен, что кто-то там будет умнее.Помогите?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 12 января 2012

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

#include <fstream>   // for std::ifstream
#include <sstream>   // for std::istringstream
#include <string>    // for std::string and std::getline
#include <vector>    // for std::vector
#include <tuple>     // for std::tuple

int main()
{
    std::ifstream infile("thefile.txt");
    std::string line;

    std::vector<std::tuple<double, double, double, double>> points;

    while (std::getline(infile, line))
    {
        std::istringstream iss(line);
        double d1, d2, d3;
        char c1, c2, c3;

        if ((iss >> c1 >> d1 >> c2 >> d2 >> c3 >> d3) &&
            (c1 == '(' && c2 == ',' && c3 == ',')        )
        {
            points.emplace_back(d1, d2, d3, 1.0);
        }
        else
        {
            // error processing this line
        }
    }
}

Две ошибки, которые могут возникнутьв том, что либо line не может быть разобрано в требуемые токены, либо разделители не соответствуют ожидаемым.Вам решать, как вы хотите справиться с этим.

Если вам нужна большая гибкость, вы можете обработать каждую строку с помощью <regex>, или вы даже можете написать гораздо более мощный общий анализатор, такой как Boost.Qi (хотя это определенно излишне).

0 голосов
/ 12 января 2012

Вам нужно прочитать эти строки в строки.Итак, предполагая, что вы прочитали строку в строку, вы можете посмотреть здесь строковые функции и выбрать то, что вам больше подходит: http://www.cplusplus.com/reference/string/string/

Вы можете использовать функцию replace для замены "," и")" с "" если это то, что вы хотите.Сделав это, вы останетесь с 3 значениями, разделенными пробелами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...