20

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

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 执行此操作?有没有类似的命令?还是我必须读取一个虚拟变量?

提前致谢。

4

5 回答 5

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

更多示例可以在这里找到

于 2010-12-30T20:44:59.017 回答
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——我没有编译这个,所以可能有错字)。

于 2009-06-11T20:36:31.770 回答
2

您可以使用 getline() 以更简单的方式完成此操作。只需使用它来抓取整行,然后解析出标记之间的值(使用 strtok?)

getline() 还有很多其他问题,但它应该可以解决您的问题。

于 2009-06-11T20:33:39.403 回答
1

我只是将它读入一个虚拟变量。如果您最终确实需要它,它将可用。

于 2009-06-11T20:29:10.583 回答
0

您可以使用

cin.ignore(256, ' ');

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

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

int a, b;
cin >> a >> b >> b;
于 2009-06-11T20:35:18.510 回答