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

时间:2011-12-02 22:59:36

标签: c++ string parsing

我有一个带有文本行的文本文件,其中包含一个字符串,另一个字符串后跟最多4个整数, 例如:

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

我看到的唯一方法是:

  

读取直到找到空格

     

将字符串设置为湿

     

读到双引号

     

读到第二次双引号

     

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

     

虽然不是行尾

     

读到空格

     

将字符串放入字符串流

     

将结果整数推送到int

的向量中

有更好的方法吗?

由于

4 个答案:

答案 0 :(得分:5)

这是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无论如何都会跳过前导空格。我把它们包括在内只是为了让它更具可读性。

答案 1 :(得分:1)

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

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...
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用getline一次读取一行。使用a regular expression library解析行。