有更好的方法来解析一行这样的文本吗?

Is there a better way to parse a line of text like this?

本文关键字:一行 文本 方法 更好      更新时间:2023-10-16

我有一个文本文件,其中文本行有一个字符串,另一个字符串后跟多达4个整数,例:

clear "clear water.png" 5 7
wet "wet water.png" 9 5 33 17
soft "soft rain falling.png" 

我唯一的看法是:

读取,直到找到空间

set string to wet

read直到双引号

读到第二个双引号

设置第二个字符串为wet water.png

而不是结束行

read until space

将字符串放入字符串流

将结果整型压入int

的向量

有更好的方法吗?

谢谢

这是scanf和公司真正的亮点。

char first_string[33], second_string[129];
sscanf(input_string, 
    "%32s%*[^"]%*c%128[^"]%*c %d %d %d %d", 
    first_string, 
    second_string, 
    &first_int, 
    &second_int,
    &third_int,
    &fourth_int);

你可能想在if语句中这样做,这样你就可以测试返回值,告诉你有多少字段被转换了(例如,这样你就知道你在最后读了多少整数)。

编辑:也许一些解释会有帮助。我们来分析一下:

%32s将字符串读取到第一个空格(或32个字符,以先到的为准)。
%*[^"]忽略第一个"以内的输入。
%*c忽略多一个字节的输入(引号本身)
%128[^"]读取引号中的字符串(即,直到下一个引号字符)。
%*c忽略结束引号%d读取int(我们已经执行了四次)。

每个%d之前的空格确实是不必要的——它将跳过空白,但是没有空格,%d将跳过前导空白。我包含它们纯粹是为了使它更易于阅读。

丑陋,没有错误检查,但不依赖于任何非标准库:

string s;
while(getline(fin, s))
{
    string word, quoted_string;
    vector<int> vec;
    istringstream line(s);
    line >> word;
    line.ignore(numeric_limits<streamsize>::max(), '"');
    getline(line, quoted_string, '"');
    int n;
    while(line >> n) vec.push_back(n);
    // do something with word, quoted_string and vec...
}

根据输入字符串的限制,您可以尝试在double-quote上分割,然后在space上分割。

使用getline一次读取一行。使用正则表达式库解析行