C++ C++;在文本文件中读取vec4的数组

C++ C++;在文本文件中读取vec4的数组,c++,arrays,file,text,C++,Arrays,File,Text,我知道有相当多的文本来排列问题,但我很难将它们与我的匹配起来 我不擅长C++,但需要用它来进行OpenGL编程。 基本上,我已经制作了一个vec4数组(对于coord系统来说,vec4只是4个“点”),然后我将它们打印到一个文本文件中。该文件如下所示(我删除了最后一点,因为它始终为1,我想我可以在以后读取文本文件时添加它): 所以每一行都被一个端点隔开 现在我想读取这个文本文件,并将其返回到vec4数组中。避免使用“(”、“、”和“)”最简单的方法是什么?我可能会写巨大的长嵌套if/else来删

我知道有相当多的文本来排列问题,但我很难将它们与我的匹配起来

我不擅长C++,但需要用它来进行OpenGL编程。 基本上,我已经制作了一个vec4数组(对于coord系统来说,vec4只是4个“点”),然后我将它们打印到一个文本文件中。该文件如下所示(我删除了最后一点,因为它始终为1,我想我可以在以后读取文本文件时添加它):

所以每一行都被一个端点隔开

现在我想读取这个文本文件,并将其返回到vec4数组中。避免使用“(”、“、”和“)”最简单的方法是什么?我可能会写巨大的长嵌套if/else来删除这些不需要的字符,但这将是非常低效的,我相信有人有一个更聪明的方法

有什么建议吗?帮忙


谢谢

您需要将这些行读入字符串。因此,假设您已将一行读入字符串,您可以查看此处的字符串函数并选择最适合您的:


如果需要,可以使用
replace
函数将“、”)替换为“”。这样做,剩下的3个值用空格隔开。

您需要将这些行读入字符串。因此,假设您已将一行读入字符串,您可以查看此处的字符串函数并选择最适合您的:


如果需要,可以使用
replace
函数将“、”)替换为“”。通过这样做,您将得到由空格分隔的3个值。

好吧,如果格式绝对确定是这样的,那么您可以进行简单的解析,嵌入到标准的基于行的输入习惯用法中:

#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
        }
    }
}
#包含//用于std::ifstream
#include//for std::istringstream
#包含//用于std::string和std::getline
#include//for std::vector
#include//for std::tuple
int main()
{
std::ifstream infle(“thefile.txt”);
std::字符串行;
std::向量点;
while(std::getline(infle,line))
{
标准::istringstream iss(线);
双d1、d2、d3;
字符c1、c2、c3;
如果((iss>>c1>>d1>>c2>>d2>>c3>>d3)&&
(c1=='('&&c2==','&&c3==','))
{
点。后侵位(d1、d2、d3、1.0);
}
其他的
{
//处理此行时出错
}
}
}
可能出现的两个错误是,
无法解析为所需的标记,或者分隔符不符合预期。这取决于您如何处理


如果您需要更大的灵活性,您可以使用
处理每一行,或者您甚至可以编写一个功能强大得多的通用解析器,如Boost.Qi(尽管这肯定有些过分)。

好吧,如果格式绝对确定是这样的,那么您可以进行简单的解析,嵌入到标准的基于行的输入习惯用法中:

#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
        }
    }
}
#包含//用于std::ifstream
#include//for std::istringstream
#包含//用于std::string和std::getline
#include//for std::vector
#include//for std::tuple
int main()
{
std::ifstream infle(“thefile.txt”);
std::字符串行;
std::向量点;
while(std::getline(infle,line))
{
标准::istringstream iss(线);
双d1、d2、d3;
字符c1、c2、c3;
如果((iss>>c1>>d1>>c2>>d2>>c3>>d3)&&
(c1=='('&&c2==','&&c3==','))
{
点。后侵位(d1、d2、d3、1.0);
}
其他的
{
//处理此行时出错
}
}
}
可能出现的两个错误是,
无法解析为所需的标记,或者分隔符不符合预期。这取决于您如何处理


如果您需要更大的灵活性,您可以使用
处理每一行,或者您甚至可以编写一个功能更强大的通用解析器,如Boost.Qi(尽管这显然有些过分).

谢谢Divya,这听起来是个不错的计划。替换听起来比逐个字符检查这些值要好得多。如果我将文本文件更改为每行上的一个浮点值(例如0.385),没有逗号和“)”,在这种情况下,以浮点形式读取它们的最佳方法是什么?再次感谢。您可以将一个值读入字符串,然后使用
atof
将该值从字符串转换为双精度。然后您可以将双精度转换为浮点。感谢Divya,这听起来是一个相当不错的计划。替换听起来比逐个字符和che要好得多对照这些值检查。如果我将文本文件更改为每行上的单个浮点值(例如0.385),并且没有逗号和“)”,那么在这种情况下,将它们作为浮点读取的最佳方式是什么?再次感谢。您可以将值读入字符串,然后使用
atof
将该值从字符串转换为双精度。然后你可以投双骰使其浮动。感谢您的编辑,我无法决定是否将文本文件放入代码块:),我将尝试此方法。这仅用于测试目的,我知道文本将以这种方式格式化,因为我正在进行编辑。感谢编辑,我无法决定是否将文本文件放入代码块:),我将尝试此方法。这只是出于测试目的,我知道文本将以这种方式格式化,因为我正在制作它。