C ++逐个元素读入文件,但每行执行函数

时间:2018-01-03 16:56:21

标签: c++ getline

我有一个我需要读入的文件。文件的每一行都非常长,所以我宁愿不将每一行读到临时字符串然后操纵这些字符串(除非这实际上效率不高 - 我错了)。该文件的每一行都包含一串三元组 - 两个数字和一个复数,用冒号分隔(与复数中使用的逗号相对)。我目前的代码是这样的:

 while (states.eof() == 0)
  {
  std::istringstream complexString;

  getline(states, tmp_str, ':');
  tmp_triplet.row() = stoi(tmp_str);
  getline(states, tmp_str, ':');
  tmp_triplet.col() = stoi(tmp_str);
  getline(states, tmp_str, ':');
  complexString.str (tmp_str);
  complexString >> tmp_triplet.value();
  // Then something useful done with the triplet before moving onto the next one
  }

tmp_triplet是一个存储这三个数字的变量。我想要一些方法来每行运行一个函数(具体来说,每行中的三元组都被推入一个向量中,文件中的每一行代表一个不同的向量)。我确信有一个简单的方法可以解决这个问题,但我只想找到一种方法来检查是否已到达行的末尾,并在这种情况下运行函数。

1 个答案:

答案 0 :(得分:0)

在尝试计划时,抽象可能是您最好的朋友。如果您通过抽象功能分解您想要做的事情,您可以更轻松地决定应该使用哪些数据类型以及应该如何规划不同的数据类型,并且通常您可以找到几乎自己编写的函数。通常,您的代码将更加模块化(几乎按定义),如果需要进行更改,将使其易于重用,维护和调整。

例如,听起来您想要解析文件。所以这应该是一个功能。

要执行该功能,您希望读入文件行,然后处理文件行。因此,您可以创建两个函数,每个函数对应一个函数,然后调用函数。

读取文件行,您只想获取文件流,并为每行返回一组字符串。

处理文件行,您需要获取字符串集合,并且每个将字符串解析为三元组值。因此,您可以创建一个采用字符串并将其分解为三元组的方法,并在此处使用该方法。

处理字符串,您只需要取一个字符串并将第一部分指定为行,将第二部分指定为列,将第三部分指定为值。

struct TripletValue
{
    int Row;
    int Col;
    int Val;
};

std::vector<TripletValue> ParseFile(std::istream& inputStream)
{
    std::vector<std::string> fileLines = ReadFileLines(inputStream);
    std::vector<TripletValue> parsedValues = GetValuesFromData(fileLines);
    return parsedValues;
}

std::vector<std::string> ReadFileLines(std::istream& inputStream)
{
    std::vector<std::string> fileLines;
    while (!inputStream.eof())
    {
        std::string fileLine;
        getline(inputStream, fileLine);
        fileLines.push_back(fileLine);
    }
    return fileLines;
}

std::vector<TripletValue> GetValuesFromData(std::vector<std::string> data)
{
    std::vector<TripletValue> values;

    for (int i = 0; i < data.size(); i++)
    {
        TripletValue parsedValue = ParseLine(data[i]);
        values.push_back(parsedValue);
    }

    return values;
}

TripletValue ParseLine(std::string fileLine)
{
    std::stringstream sstream;
    sstream << fileLine;

    TripletValue parsedValue;

    std::string strValue;
    sstream >> strValue;
    parsedValue.Row = stoi(strValue);

    sstream >> strValue;
    parsedValue.Col = stoi(strValue);

    sstream >> strValue;
    parsedValue.Val = stoi(strValue);

    return parsedValue;
}