Как прочитать байт и сохранить значение байта ASCII в целое число в C ++ - PullRequest
5 голосов
/ 03 марта 2012

У меня простой вопрос, который меня смущает.

Цель : я хочу прочитать данный байт из файла (скажем, первый байт) и сделать int x со значением ASCII этого байта. Так, например, если байт / символ «а», я хочу, чтобы х было 97 (= 61 в шестнадцатеричном формате). У меня есть следующее чтение первого байта файла 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;
}

Проблема : Если первый байт представлен 08, то действительно я получаю вывод 8. Но если байт представлен 09, то я получаю 0. Я заметил, что мне кажется, получите следующий байт, если этот байт также не равен 09. Я не знаю, заключается ли моя проблема только в том, что байт представлен в ASCII как 09.

Вопрос : Итак, как мне прочитать, скажем, первый (или третий или любой другой) байт из файла и сделать int со значением ASCII этого байта?

(Я на Windows XP)

Ответы [ 3 ]

3 голосов
/ 03 марта 2012

Пара предложений:

  • Проверьте, действительно ли файл был открыт. Если это не так, убедитесь, что файл находится в текущем каталоге, или укажите полный путь.
  • Вы, вероятно, хотите ios::in (не ios::out).
  • Используйте noskipws, если вы действительно не хотите пропускать пробелы.
  • Какова цель возвращения персонажа? Соглашение состоит в том, чтобы интерпретировать ненулевой код выхода как ошибку (хотя по общему признанию, строгого стандарта на это нет).

Следующая программа читает 4-й символ и выводит его значение HEX для меня отлично:

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

}

(замените <path> на фактический путь.)

3 голосов
/ 03 марта 2012

Это должно исправить.

 myFile >> noskipws >> b;
2 голосов
/ 03 марта 2012

Попробуйте прочитать, используя ifstream::read вместо operator>>.Это сработало для меня:

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