C++ 格式化输入:如何“跳过” 代币?

发布于 2024-07-24 07:48:59 字数 406 浏览 7 评论 0原文

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

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 执行此操作? 有类似的命令吗? 或者我必须读取虚拟变量吗?

提前致谢。

Suppose I have an input file in this format:

VAL1 VAL2 VAL3
VAL1 VAL2 VAL3

I'm writing a program that would be interested only in VAL1 and VAL3. In C, if i wanted to 'skip' the second value, I'd do as follows:

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

Meaning, I'd use the "%*s" formatter to make fscanf() read this token and skip it. How do I do this with C++'s cin? Is there a similar command? Or do I have to read to a dummy variable?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

何止钟意 2024-07-31 07:48:59

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

更多示例请参见< a href="http://www.codeproject.com/KB/recipes/Tokenizer.aspx">此处

The C++ String Toolkit Library (StrTk) has the following solution to your problem:

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

More examples can be found Here

自我难过 2024-07-31 07:48:59

有一个 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 - 我没有编译这个,所以可能有错字)。

There's an ignore function available:

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

The first argument defines the number of characters to skip, the second parameter is the delimiter to stop skipping at.

You could wrap that up in a user-defined manipulator, since it's ugly.


Here's the custom manipulator:

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

And you could use that like this:

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

(ps -- I didn't compile this, so there maybe a typo).

流殇 2024-07-31 07:48:59

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

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

You can do it in a much easier way with getline(). Just use it to grab the entire line, and then parse out the values in between the tokens (use strtok?)

There are a whole bunch of other issues with getline(), but it should work for your problem.

季末如歌 2024-07-31 07:48:59

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

I would just read it into a dummy variable. If you do need it eventually, it will be available.

情何以堪。 2024-07-31 07:48:59

您可以使用

cin.ignore(256, ' ');

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

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

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

You can use

cin.ignore(256, ' ');

This will ignore everything up to either 256 characters or a white space.

Edit (formatting and...): alternatives you can do:

int a, b;
cin >> a >> b >> b;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文