usar tokens sirve separar que para dev como c++ formatted-input

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.