2012-03-03 6 views
5

Ho una semplice domanda che mi confonde.Come leggere un byte e salvare il valore ASCII del byte nel numero intero in C++

Obiettivo: Voglio leggere un determinato byte da un file (ad esempio il primo byte) e creare int x con il valore ASCII di quel byte. Quindi, per esempio, se il byte/carattere è 'a', voglio che x sia 97 (= 61 in hex). Ho la seguente lettura del primo byte del file 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: Se il primo byte è rappresentato da 08, allora davvero ricevo una potenza di 8. Ma se il byte è rappresentato entro 09, poi ottengo 0. Ho notato che mi sembra di ottenere il seguente byte a meno che il byte sia anche 09. Non so se il mio problema è solo quando il byte è rappresentato in ASCII di 09.

Domanda: Quindi, come leggo dire il primo (o terzo o qualsiasi altro) byte da un file e creare un int con il valore ASCII di quel byte?

(Sono su Windows XP)

+0

Perché non hai appena letto in un 'char'? –

+0

@ Corse di leggerezza in orbita: Grazie per il commento. Stavo cercando di leggere in un carattere, ma voglio il valore di ogni carattere e quando il valore era 09, stavo ottenendo il valore 0. (se questo ha senso?) – Thomas

risposta

3

Questo dovrebbe risolvere il problema.

myFile >> noskipws >> b; 
2

provare a leggere utilizzando ifstream::read invece di operator>>. Questo ha funzionato per me:

#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

paio di suggerimenti:

  • Verificare se il file è stato effettivamente aperto. In caso contrario, assicurarsi che il file si trovi nella directory corrente o fornire il percorso completo.
  • Probabilmente si desidera ios::in (non ios::out).
  • Utilizzare noskipws a meno che non si desideri ignorare gli spazi bianchi.
  • Qual è lo scopo di restituire il personaggio? La convenzione è interpret a non-zero exit code as a failure (anche se, ammettiamolo, non esiste uno standard rigoroso su questo).

Il seguente programma legge il 4 ° carattere e stampa il suo valore HEX bene per me:

#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; 

} 

(Sostituire <path> con il percorso vero e proprio.)

+0

Grazie per i suggerimenti. La soluzione noskipws ha funzionato per me. Restituire il personaggio è stato solo un errore da quando stavo giocando con le cose. Perché dovrei usare ios :: in invece di ios :: out quando voglio leggere dal file? (potresti già aver capito che sono nuovo di C++) – Thomas

+1

@ThomasM Perché vuoi "input" dal file, non "output" ad esso. –

+0

Hai ragione! Lo avevo frainteso. Grazie! Mi chiedo perché funzioni allora ... – Thomas