Почему unsigned char * не работает с ifstream :: read? - PullRequest
0 голосов
/ 29 июля 2010

Я новичок в C ++. У меня есть новый проект на работе, где я должен изучить его, поэтому я пробую кое-что просто проверить свое понимание. Для этой проблемы я пытаюсь прочитать файл, а затем распечатать его на экране. Супер просто, просто пытаюсь добиться успеха в этом и понять функции, которые я использую. Я скопировал некоторый текст из документа MS Word в файл блокнота (* .txt) и пытаюсь прочитать этот файл * .txt. Весь текст в документе word выделен жирным шрифтом, но кроме этого нет никаких «необычных» символов. Все выводится на экран так, как оно выглядит в документе, кроме выделенного жирным шрифтом символа «-». Этот символ печатается как "u" с символом шляпы (так называемый расширенный код ASCII 150). Я пытаюсь распечатать целочисленное значение этого символа в моем массиве (которое должно быть 150), но я получаю -106. Я понимаю, что это целое число со знаком имеет те же биты, что и целое число без знака 150. Мой вопрос: как получить результат, чтобы сказать 150? Вот мой код:

        #include <iostream>
        #include <fstream>
        using namespace std;

       int main() {
       unsigned char* input1;
       int input1size = 57;
       ifstream file("hello_world2.txt",ios::binary | ios::ate);
       if (file.is_open()){
            int size;
            size = (int) file.tellg();
            cout <<"This file is " << size << " bytes." << endl;
            file.seekg(0,ios::beg);
            input1 = new unsigned char[input1size];
            file.read(input1, input1size);
            cout << "The first " << input1size <<" characters of this file are:" << endl<<endl;
            for (int i=0; i<input1size; i++) {
            cout << input1[i];
       }
       cout<<endl;
       }
       else {
       cout <<"Unable to open file" << endl;
       int paus;
       cin>>paus;
       return 0;
       }
       file.close();
       int charcheck = 25;
       int a=0;
       int a1=0;
       int a2=0;
       unsigned int a3=0;
       unsigned short int a4=0;
       short int a5=0;
       a = input1[charcheck];
       a1 = input1[charcheck-1];
       a2 = input1[charcheck+1];
       a3 = input1[charcheck];
       a4 = input1[charcheck];
       a5 = input1[charcheck];
       cout <<endl<<"ASCII code for char in input1[" << charcheck-1 <<"] is: " << a1 << endl;
       cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] is: " << a << endl;
       cout <<endl<<"ASCII code for char in input1[" << charcheck+1 <<"] is: " << a2 << endl;
       cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] as unsigned int: " << a3 << endl;
       cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] as unsigned short int: " << a4 << endl;
       cout <<endl<<"ASCII code for char in input1[" << charcheck <<"] as short int: " << a5 << endl;
       int paus;
       cin>>paus;
       return 0;
       }

Вывод для всего этого выглядит так:

    This file is 80 bytes.
    The first 57 characters of this file are:

    STATUS REPORT
    PERIOD 01 u 31 JUL 09

    TASK 310: APPLIC

    ASCII code for char in input1[24] is: 32
    ASCII code for char in input1[25] is: -106
    ASCII code for char in input1[26] is: 32
    ASCII code for char in input1[25] as unsigned int: 4294967190
    ASCII code for char in input1[25] as unsigned short int: 65430
    ASCII code for char in input1[25] as short int: -106

Таким образом, кажется, что «int a» всегда читается как подписанный. Когда я пытаюсь сделать «a» без знака, он превращает все биты, оставшиеся от восьми битов для символа, в 1. Почему это? Извините за длину вопроса, просто пытаюсь быть подробным. Спасибо!

1 Ответ

0 голосов
/ 29 июля 2010

То, с чем вы имеете дело, это расширение знака, которое имеет место, когда символ повышается до int, когда вы назначаете его одному из ваших a? переменные.

Все биты старшего разряда должны быть установлены в 1, чтобы сохранить то же отрицательное значение, которое было в меньшем хранилище символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...