C++ ifstream 拆分 w.r.t. 一个角色

C++ ifstream split w.r.t. a character

本文关键字:一个 角色 ifstream 拆分 C++      更新时间:2023-10-16

我想逐行C++读取文件,并将每行w.r.t拆分为"t"字符,以便填写矩阵。 我的代码会像这样

    ifstream data_x;
        double** test_data = new double*[100];
        for(int j = 0 ; j <  ; j++)
             test_data[j] = new double[4]; 
    data_x.open("X.txt");
    int i = 0;
    if (data_x.is_open()) 
    {
        while (!data_x.eof()) 
        {
            char** split = data_x.split("t") 
            for(int k = 1 ; k < 4 ; k++)
                 test_data[i][k];
            i++;
        }
    }
    data_x.close();
    ifstream data_y;
    data_y.open("Y.txt");
    i = 0;
    if (data_y.is_open()) 
    {
        while (!data_y.eof()) 
        {
            data_y >> test_data[i][0];
            i++;
        }
    }
    data_y.close(); 

其中语法

 char** split = data_x.split("t") 
 for(int k = 1 ; k < 4 ; k++)
      test_data[i][k];

是近似的。 如何用C++正确地做到这一点?

谢谢

假设您的文件只包含数字,以下是标准的C++习语:

#include <vector>
#include <string>
#include <sstream>
#include <fstream>
std::ifstream infile("data.txt");
std::vector<std::vector<double>> matrix;
for (std::string line; std::getline(infile, line); )
{
     std::istringstream iss(line);
     std::vector<double> row;
     for (double d; iss >> d; )
     {
         row.push_back(d);
     }
     matrix.push_back(row);
}

如果您知道矩阵的大小,则可以添加相关的reserve调用以避免向量重新分配。您还可以添加测试,以确定一行上是否有任何无法识别的数据,但现在这应该可以让您开始。

用空格分隔的实体创建向量实际上是微不足道的:

std::vector<T> fields(
    std::istream_iterator<T>(
        d::istringstream(line) >> std::skipws),
    std:.istream_iterator<T>()));

如果您的单元格类型 T 会考虑't'以外的其他空格作为分隔符,您可能希望使用修改后的std::ctype<char>面更改被视为空间的内容。

显然,上面的逻辑可以打包成一些更容易使用的 finction。