【问题标题】:C++ Reading in Text file to Array of vec4C++ 将文本文件读入 vec4 数组
【发布时间】:2012-01-12 03:50:46
【问题描述】:

我知道有很多文本到数组的问题,但我很难将这些问题与我的匹配。

我不擅长 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 )

所以每一行都用一个endl分隔;

现在我想读取这个文本文件并将其重新转换为 vec4 数组。避免使用“(”,“,”和“)”的最简单方法是什么?我可能会编写巨大的长嵌套 if/else 来清除这些不需要的字符,但这会非常低效,我敢肯定有人有更聪明的方法。

有什么建议吗?帮助?

谢谢!

【问题讨论】:

    标签: c++ arrays file text


    【解决方案1】:

    好吧,如果格式绝对肯定是这样的话,那你可以做一个朴素的解析,这里嵌入标准的基于行的输入习语:

    #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 无法解析为所需的标记,或者分隔符与预期不符。由您决定如何处理。

    如果您需要更大的灵活性,您可以使用 &lt;regex&gt; 处理每一行,或者您甚至可以编写功能更强大的通用解析器,例如 Boost.Qi(尽管这绝对是矫枉过正)。

    【讨论】:

    • 感谢您的编辑,我无法决定我的文本文件是否应该进入代码块:) 我会尝试这种方法。这仅用于测试目的,我知道文本将以这种方式格式化,因为我正在制作它。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 Divya,这听起来是个不错的计划。替换听起来比逐个字符地检查这些值要好得多。如果我将文本文件更改为每行上没有逗号且没有“)”的单个浮点值(例如 0.385),那么在这种情况下将它们作为浮点数读取的最佳方法是什么?再次感谢。
    • 您可以将一个值读入字符串,然后使用atof 将该值从字符串转换为双精度值。然后,您可以将 double 转换为浮动。 cplusplus.com/reference/clibrary/cstdlib/atof
    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 2020-01-20
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2017-07-16
    相关资源
    最近更新 更多