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

Raf*_*ida 20 c++ formatted-input

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

VAL1 VAL2 VAL3
VAL1 VAL2 VAL3
Run Code Online (Sandbox Code Playgroud)

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

char VAL1[LENGTH]; char VAL3[LENGTH];
FILE * input_file;
fscanf(input_file, "%s %*s %s", VAL1, VAL3);
Run Code Online (Sandbox Code Playgroud)

意思是,我使用"%*s"格式化程序使fscanf()读取此标记并跳过它.我如何用C++的cin做到这一点?有类似的命令吗?或者我必须读取虚拟变量?

提前致谢.

小智 14

C++字符串工具箱库(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;
}
Run Code Online (Sandbox Code Playgroud)

更多例子可以在这里找到


edu*_*ffy 7

有一个ignore功能:

std::cin << val1;
std::cin.ignore (9999, ' ');
std::cin << val3;
Run Code Online (Sandbox Code Playgroud)

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

您可以将其包装在用户定义的操纵器中,因为它很难看.


这是自定义操纵器:

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

你可以像这样使用它:

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5;
Run Code Online (Sandbox Code Playgroud)

(ps - 我没有编译这个,所以可能有一个错字).

  • 什么是愚蠢的是强迫自己使用一些臭的东西(C++流IO),因为它就在那里.实际上IMO真正可怕的是输出格式化,但即便输入也不是那么好. (2认同)