2012-03-03 16 views
5

Mam proste pytanie, które mnie myli.Jak czytać bajt i zapisać wartość ASCII w liczbie całkowitej w C++

bramki: Chcę przeczytać dany bajt z pliku (powiedzmy pierwszy bajt) i zrobić int X o wartości ASCII tego bajta. Na przykład, jeśli bajt/znak jest "a", chcę, żeby x był równy 97 (= 61 na heksie). Mam następujący czytając pierwszy bajt example.txt Plik:

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

Problem: Jeśli pierwszy bajt jest reprezentowany przez 08, to rzeczywiście mam moc 8. Ale jeśli bajt jest reprezentowany do 09, to dostaję 0. Zauważyłem, że wydaje się, że otrzymuję następujący bajt, chyba że ten bajt to także 09. Nie wiem, czy mój problem jest tylko wtedy, gdy bajt jest reprezentowany w ASCII przez 09.

Pytanie: Więc jak mogę przeczytać pierwszy (lub trzeci) bajt z pliku i utworzyć int z wartością ASCII tego bajtu?

(Jestem w systemie Windows XP)

+0

Dlaczego po prostu nie czytać w 'char'? –

+0

@ Lekkość Wyścigi na orbicie: Dzięki za komentarz. Próbowałem odczytać char, ale chcę ascii wartości każdej postaci, a gdy wartość wynosiła 09, otrzymywałem wartość 0. (jeśli to ma sens?) – Thomas

Odpowiedz

3

To powinno naprawić.

myFile >> noskipws >> b; 
2

Spróbuj przeczytać użyciu ifstream::read zamiast operator>>. Ten pracował dla mnie:

#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

Kilka sugestii:

  • Sprawdź, czy plik został faktycznie otwarty. Jeśli nie, upewnij się, że plik znajduje się w aktualnym katalogu lub podaj pełną ścieżkę.
  • Prawdopodobnie chcesz ios::in (a nie ios::out).
  • Użyj noskipws, chyba że chcesz pominąć białe spacje.
  • Jaki jest cel oddania postaci? Konwencja jest do interpret a non-zero exit code as a failure (choć wprawdzie nie ma ścisłego standardu na ten temat).

Następujący program odczytuje 4th charakter i wypisuje jej wartość HEX dobrze dla mnie:

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

} 

(Wymień <path> z rzeczywistej ścieżki.)

+0

Dzięki za sugestie. Rozwiązanie noskipws zadziałało dla mnie. Powracanie postaci było po prostu błędem, kiedy bawiłem się z rzeczami. Dlaczego powinienem używać ios :: in zamiast ios :: out, kiedy chcę odczytać z pliku? (być może już wiesz, że jestem nowy w C++) – Thomas

+1

@ThomasM Ponieważ chcesz "wejść" z pliku, a nie "wypisać" do niego. –

+0

Masz rację! Źle to zrozumiałem. Dzięki! Zastanawiam się, dlaczego wtedy działa ... – Thomas

Powiązane problemy