2012-03-03 18 views
5

Tengo una pregunta simple que me confunde.Cómo leer un byte y guardar el valor ASCII de byte en entero en C++

Objetivo: Quiero leer un byte dado de un archivo (digamos el primer byte) y hacer int x con el valor ASCII de ese byte. Entonces, por ejemplo, si el byte/carácter es 'a', quiero que x sea 97 (= 61 en hexadecimal). Tengo el siguiente de leer el primer byte del archivo example.txt:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(){ 
    unsigned int x; 
    unsigned char b; 
    ifstream myFile ("example.txt", ios::out | ios::binary); 
    myFile.seekg (0, ios::beg); 
    myFile >> b; 
    x = (unsigned int)b; 
    cout << hex << x; 
    return b; 
} 

Problema: Si el primer byte está representado por 08, entonces sí me da una potencia de 8. Pero si se representa el byte para el 09, luego obtengo 0. He notado que parece obtener el siguiente byte a menos que ese byte también sea 09. No sé si mi problema es solo cuando el byte está representado en ASCII por 09.

Pregunta: Entonces, ¿cómo leo para decir el primer (o tercero o lo que sea) byte de un archivo y hacer un int con el valor ASCII de ese byte?

(Estoy en Windows XP)

+0

¿Por qué no acaba de leer en un 'char'? –

+0

@ Lightness Races in Orbit: Gracias por el comentario. Estaba tratando de leer en un char, pero quiero obtener el valor ascii de cada personaje y cuando el valor era 09, estaba obteniendo el valor 0. (si tiene sentido?) – Thomas

Respuesta

3

Esto debería solucionarlo.

myFile >> noskipws >> b; 
2

tratar de leer usando ifstream::read en lugar de operator>>. Esto ha funcionado para mí:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(){ 
    unsigned int x; 
    unsigned char b; 
    ifstream myFile ("example.txt", ios::out | ios::binary); 
    myFile.seekg (0, ios::beg); 
    myFile.read(reinterpret_cast<char*>(&b), sizeof(b)); 
    x = (unsigned int)b; 
    cout << hex << x; 
    return b; 
} 
3

par de sugerencias:

  • Comprobar si el archivo en realidad se ha abierto. Si no fue así, asegúrese de que el archivo esté en el directorio actual o proporcione la ruta completa.
  • Probablemente desee ios::in (no ios::out).
  • Use noskipws a menos que realmente quiera saltear espacios en blanco.
  • ¿Cuál es el propósito de devolver el personaje? La convención es a interpret a non-zero exit code as a failure (aunque es cierto que no hay un estándar estricto sobre esto).

El siguiente programa lee el cuarto carácter e imprime su valor HEX bien para mí:

#include <iostream> 
#include <fstream> 
#include <stdlib.h> 

using namespace std; 

int main() { 

    ifstream myFile("<path>\\example.txt", ios::in | ios::binary); 

    if (myFile) { 

     unsigned char b; 
     myFile.seekg(3) >> noskipws >> b; 

     if (myFile) { // File was long enough? 
      unsigned int x = b; 
      cout << hex << x; 
      return EXIT_SUCCESS; 
     } 

    } 

    return EXIT_FAILURE; 

} 

(Reemplazar <path> con la ruta real.)

+0

Gracias por las sugerencias. La solución noskipws funcionó para mí. Devolver el personaje fue solo un error cuando jugaba con cosas. ¿Por qué debería usar ios :: in en lugar de ios :: out cuando quiero leer del archivo? (es posible que ya se haya dado cuenta de que soy nuevo en C++) – Thomas

+1

@ThomasM Porque quiere "ingresar" desde el archivo, no "generarlo". –

+0

¡Tienes razón! Lo había entendido mal. ¡Gracias! Me pregunto por qué funciona entonces ... – Thomas

Cuestiones relacionadas