C ++格式化输入:如何“跳过”令牌?

时间:2009-06-11 20:28:12

标签: c++ formatted-input

假设我有一个这种格式的输入文件:

VAL1 VAL2 VAL3
VAL1 VAL2 VAL3

我正在编写一个只对VAL1和VAL3感兴趣的程序。在C中,如果我想“跳过”第二个值,我会这样做:

char VAL1[LENGTH]; char VAL3[LENGTH];
FILE * input_file;
fscanf(input_file, "%s %*s %s", VAL1, VAL3);

意思是,我使用“%* s”格式化程序使fscanf()读取此标记并跳过它。 如何使用C ++的cin执行此操作?是否有类似的命令?或者我是否必须阅读虚拟变量?

提前致谢。

5 个答案:

答案 0 :(得分:14)

C++ String Toolkit Library (StrTk)针对您的问题提供了以下解决方案:

#include <string>
#include <deque>
#include "strtk.hpp"

int main()
{
   struct line_type
   {
      std::string val1;
      std::string val3;
   };

   std::deque<line_type> line_list;

   const std::string file_name = "data.txt";

   strtk::for_each_line(file_name,
                        [&line_list](const std::string& line)
                        {
                           strtk::ignore_token ignore;
                           line_type temp_line;
                           const bool result = strtk::parse(line,
                                                            " ",
                                                            temp_line.val1,
                                                            ignore,
                                                            temp_line.val3);
                           if (!result) return;
                           line_list.push_back(temp_line);
                        });

   return 0;
}

可以找到更多示例Here

答案 1 :(得分:7)

可以使用ignore功能:

std::cin << val1;
std::cin.ignore (9999, ' ');
std::cin << val3;

第一个参数定义要跳过的字符数,第二个参数是停止跳过的分隔符。

你可以将它包装在一个用户定义的操纵器中,因为它很难看。


这是自定义操纵器:

template <class charT, class traits>
inline std::basic_istream<charT, traits> &
ignoreToken (std::basic_istream<charT, traits> &strm)
{
    strm.ignore (9999, ' ');
    return strm;
}

你可以这样使用:

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5;

(ps - 我没有编译这个,所以可能有拼写错误。)

答案 2 :(得分:2)

您可以使用getline()更轻松地完成此操作。只是用它来抓取整行,然后解析出令牌之间的值(使用strtok?)

getline()存在很多其他问题,但它应该适用于您的问题。

答案 3 :(得分:1)

我只是把它读成虚拟变量。如果你最终确实需要它,它将可用。

答案 4 :(得分:0)

您可以使用

cin.ignore(256, ' ');

这将忽略最多256个字符或空格的所有内容。

编辑(格式化和...):您可以做的替代方案:

int a, b;
cin >> a >> b >> b;