我有一个带有文本行的文本文件,其中包含一个字符串,另一个字符串后跟最多4个整数, 例如:
clear "clear water.png" 5 7
wet "wet water.png" 9 5 33 17
soft "soft rain falling.png"
我看到的唯一方法是:
读取直到找到空格
将字符串设置为湿
读到双引号
读到第二次双引号
将第二个字符串设置为wet water.png
虽然不是行尾
读到空格
将字符串放入字符串流
将结果整数推送到int
的向量中
有更好的方法吗?
由于
答案 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解析行。