从输入流中读取格式化的文本

时间:2018-09-05 21:22:58

标签: c++ string input

我有一个.txt文件,我希望从中获取某种行格式,其中包含我需要保留的数据。

例如:

input.txt:

Number: 654
Name: Alon
-----

我需要:

1。提取654和“ Alon”到其相应的变量中。

2。如果格式不正确,则会引发错误。

如果这是C,我可能会使用:

if (fscanf(inputFile, "Number: %d", &num) == 0)
{
    // raise an error
}

假设使用C函数不是一个好主意,我剩下的是std :: cin,它可能使我可以访问需要提取的数据,但无法控制包装数据的字符串的确切格式。

我已经打开并使用将文件作为“ ifstream”读取。我还使用std :: getline(...)检索了第一行。 这就是我所拥有的:

std::ifstream inputFile;
string lineToParse;
inputFile.open("input.txt", std::fstream::in);
if (inputFile.fail())
{
    // throw exception
}
else
{
    std::getline(inputFile, lineToParse);
    int data;
    inputFile >> data;
}

假设input.txt是上面的文件,我希望lineToParse为“ Number:654”,数据为654。 但是正如我所说,我无法以这种方式控制行的格式。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用std::getline来解析诸如':'之类的特定字符。

类似的东西:

int line_number = 0;
while(std::getline(inputFile, lineToParse))
{
    ++line_number;

    // check for empty lines here and skip them

    // make a stream out of the line
    std::istringstream iss(lineToParse);

    std::string key, value;
    if(!std::getline(std::getline(iss, key, ':') >> std::ws, value))
    {
        std::cerr << "bad format at line: " << line_number << '\n';
        continue;
    }

    // do something with key and value here...
}

您有keyvaluekey应该告诉您如何转换值(整数,浮点数,日期/时间等)。