2012-01-12 2 views
0

Я знаю, что существует немало вопросов от текста к массиву, но мне трудно совместить их с моими.C++ Чтение в текстовом файле в Array of vec4

Я плохо разбираюсь в 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) 

Так каждая линия разделяется на один End L,;

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

Любые предложения? Помогите?

Спасибо!

ответ

4

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

#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

Спасибо за редактирование, я не мог решить, должен ли мой текстовый файл входить в кодовые блоки :) И я попробую этот метод. Это только для целей тестирования, и я знаю, что текст будет отформатирован таким образом, потому что я это делаю. – user1144605

0

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

Вы можете использовать функцию replace заменить «» и „)“ с „“ если это то что ты хочешь. Делая это, вы останетесь с тремя значениями, разделенными пробелами.

+0

Спасибо Дивья, это звучит как достаточно приличный план. Замените звуки намного лучше, чем просмотр символа char и проверка на эти значения. Если я изменяю текстовый файл как просто одно значение float (например, 0,385) в каждой строке без запятых и no ")", что было бы лучшим способом прочитать их как float в этом случае? Еще раз спасибо. – user1144605

+0

Вы можете прочитать значение в строке, а затем использовать 'atof' для преобразования этого значения из строки в double. Затем вы можете использовать double для плавания. http://www.cplusplus.com/reference/clibrary/cstdlib/atof/ – Divya

Смежные вопросы