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)
更多例子可以在这里找到
有一个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 - 我没有编译这个,所以可能有一个错字).