如何格式化字符串流的输出?

时间:2013-10-16 20:45:36

标签: c++ file format string-formatting stringstream

我正在尝试从字符串流中获取特定数据。 我正在从文件中将这些数据读入stringstream。

f 2/5/6 1/11/6 5/12/6 8/10/6 

现在,当我想将数据读入变量时,我该怎么做? 这是我想要的格式。

stringstream s(line);
string tmpn;
int t[4];
int a, b, c, d, e;
s >>tmpn >>a >>t[0] >>b >>c >>t[1] >>b >>d >>t[2] >>b >>e >>t[3] >>b;

所以基本上我想要第一个字符,然后每个数字都在不带斜线的单独值中。

我该怎么做? 我尝试使用sscanf,但这太可怕了! 我正在使用C ++ / CLI。

3 个答案:

答案 0 :(得分:1)

如果您可以保证输入始终采用该格式,只需用空格替换斜杠。

replace(line.begin(), line.end(), '/', ' ');

stringstream s(line);
string tmpn;
int t[4];
int a, b, c, d, e;
s >>tmpn >>a >>t[0] >>b >>c >>t[1] >>b >>d >>t[2] >>b >>e >>t[3] >>b;

replace()标题中找到了<algorithm>

否则,您必须手动拆分它。

答案 1 :(得分:1)

我建议创建一个阅读小组的功能:

void read_group(std::stringstream& s, int& a, int& b, int &c)
{
    char temp;
    s >> a;
    s >> temp; // First '/'
    s >> b;
    s >> temp;  // second '/'
    s >> c;
}

如果组和组中的数字相关,您可能希望使用从stringstream中提取的方法为它们创建一个类。

答案 2 :(得分:0)

使用此类将斜杠/分类为空格:

struct csv_whitespace
    : std::ctype<char>
{
    static const mask* make_table()
    {
        static std::vector<mask> v(classic_table(), classic_table() + table_size);
        v['/'] |=  space;
        return &v[0];
    }
    csv_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) {}
};

您可以使用此方面填充输入流:

iss.imbue(std::locale(iss.getloc(), new csv_whitespace));

现在斜线字符将被视为分隔符。例如:

std::istringstream iss("2/5/6 1/11/6 5/12/6 8/10/6");
iss.imbue(std::locale(iss.getloc(), new csv_whitespace));
int i;

while (iss >> i)
{
    std::cout << i;
}

输出:

  

2
  5
  6
  1
  11个
  ...