sirve - separar en tokens c++
Entrada formateada en C++: ¿cómo ''saltar'' tokens? (5)
Hay una función de ignore
disponible:
std::cin << val1;
std::cin.ignore (9999, '' '');
std::cin << val3;
El primer argumento define el número de caracteres a omitir, el segundo parámetro es el delimitador para dejar de saltar.
Podrías envolver eso en un manipulador definido por el usuario, ya que es feo.
Aquí está el manipulador personalizado:
template <class charT, class traits>
inline std::basic_istream<charT, traits> &
ignoreToken (std::basic_istream<charT, traits> &strm)
{
strm.ignore (9999, '' '');
return strm;
}
Y podrías usar eso así:
cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5;
(pd: no compilé esto, así que quizás haya un error tipográfico).
Supongamos que tengo un archivo de entrada en este formato:
VAL1 VAL2 VAL3
VAL1 VAL2 VAL3
Estoy escribiendo un programa que solo estaría interesado en VAL1 y VAL3. En C, si quisiera "omitir" el segundo valor, haría lo siguiente:
char VAL1[LENGTH]; char VAL3[LENGTH];
FILE * input_file;
fscanf(input_file, "%s %*s %s", VAL1, VAL3);
Lo que significa que usaría el formateador "% * s" para hacer que fscanf () lea este token y lo omita. ¿Cómo hago esto con cin de C ++? ¿Hay un comando similar? ¿O tengo que leer a una variable ficticia?
Gracias por adelantado.
La biblioteca del kit de herramientas de cadenas de C ++ (StrTk) tiene la siguiente solución para su problema:
#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;
}
Más ejemplos se pueden encontrar Here
Puedes hacerlo de una manera mucho más fácil con getline (). Solo úselo para agarrar la línea completa, y luego analice los valores entre las fichas (use strtok?)
Hay un montón de otros problemas con getline (), pero debería funcionar para su problema.
Puedes usar
cin.ignore(256, '' '');
Esto ignorará todo hasta 256 caracteres o un espacio en blanco.
Editar (formatear y ...): alternativas que puedes hacer:
int a, b;
cin >> a >> b >> b;
Simplemente lo leería en una variable ficticia. Si lo necesitas eventualmente, estará disponible.