从输入流中读取格式化文本[重复]

Posted

技术标签:

【中文标题】从输入流中读取格式化文本[重复]【英文标题】:Reading formatted text from input stream [duplicate] 【发布时间】:2018-09-05 21:22:57 【问题描述】:

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

例如:

输入.txt:

Number: 654
Name: Alon
-----

我需要:

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

2。如果格式不准确,则抛出错误。

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

if (fscanf(inputFile, "Number: %d", &num) == 0)

    // raise an error

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

我已经使用 .我还使用 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 是“数字:654”,数据是 654。 但正如我所说,我无法通过这种方式控制行的格式。

有什么想法吗?

【问题讨论】:

你试过什么?您是否尝试过使用<fstream> 打开文本文件并阅读它? std::getline 可能迟早会进入您的代码。 编辑我的问题以使其更清晰:我以“ifstream”的形式打开并读取文件,并使用“std::getline”检索了第一行。 你需要一个这样的 while 循环:while (std::getline(inputFile, lineToParse)) 然后按照@WhozCraig 所说的在循环中使用 lineToParse。 Read file line by line in C++、Parsing key/value pairs from a string in C++ 和 Split string into key-value pairs using C++ 的可能重复项 【参考方案1】:

您可以使用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...

你有你的keyvalue key 应该告诉你如何转换值(无论是整数、浮点数、日期/时间等......)。

【讨论】:

以上是关于从输入流中读取格式化文本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

sed基本用法

java文件读写操作指定编码格式

字符输入流读取文本文件ReaderFileReaderBufferedReader

字符输入流读取文本文件ReaderFileReaderBufferedReader

awk文本处理工具

字符流读写文本文件