2011-04-13 23 views
5

Tengo algunos problemas con la lectura de un archivo en C++. Puedo leer solo enteros o solo alfabetos. Pero no puedo leer ambos, por ejemplo, 10af, ff5a. Mi procedimiento es el siguiente:Leyendo una mezcla de enteros y caracteres de un archivo en C++

int main(int argc, char *argv[]) { 

if (argc < 2) { 
    std::cerr << "You should provide a file name." << std::endl; 
    return -1; 
} 

std::ifstream input_file(argv[1]); 
if (!input_file) { 
    std::cerr << "I can't read " << argv[1] << "." << std::endl; 
    return -1; 
} 

std::string line; 
for (int line_no = 1; std::getline(input_file, line); ++line_no) { 
    //std::cout << line << std::endl; 

     ----------- 
    } 
     return 0; 
} 

Así que lo que estoy tratando de hacer es, estoy permitiendo al usuario especificar el archivo de entrada que quiere leer, y estoy usando getline para obtener cada línea. Puedo usar el método de tokens para leer solo enteros o solo alfabetos. Pero no puedo leer una mezcla de ambos. Si mi archivo de entrada es

2 1 89AB

8 2 16ss

¿Cuál es la mejor manera de leer este archivo?

¡Muchas gracias de antemano por su ayuda!

+0

No está seguro de lo que entendemos por método de fichas. ¿Estás tratando de tokenizar cada línea y falla? entonces ¿por qué no incluye esa parte del código aquí? – Pirooz

Respuesta

0

Usando

std::string s; 
while (input_file >> s) { 
    //add s to an array or process s 
    ... 
} 

puede leer las entradas del tipo std::string que podría ser cualquier combinación de dígitos y alfabetos. No es necesario que lea la entrada línea por línea y luego intente analizarla. El operador >> considera el espacio y la línea nueva como delimitadores.

+0

Oh Ok. Gracias. Voy a probar eso. No sabía que podía hacer esto. – Sista

2

Usaría std::stringstream, y use std::hex ya que 89ab y 16ff parecen números hexadecimales.

debería tener este aspecto:

std::string line; 
for (int line_no = 1; std::getline(input_file, line); ++line_no) 
{ 
    std::stringstream ss(line); 
    int a, b, c; 

    ss >> a; 
    ss >> b; 
    ss >> std::hex >> c; 
} 

Tendrá que #include <sstream>

+0

Ya tienes razón. Esto tiene sentido para mí. Funciona bien. He entendido ahora qué hacer. Gracias. :) – Sista