Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
newbie666
Заблокирован
#1

Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? - C++

06.05.2014, 10:53. Просмотров 816. Ответов 6
Метки нет (Все метки)

Ну собственно сабж...
C++
1
2
std::fstream fs;
fs.write((char*)..)
В случае бинарного потока я допустим пишу байты функцией write, как известно, байт - это значение от 0 до 255, то есть от 0 до FF, этот диапазон укладывается в unsigned char, а не в простой char, так почему же эта функция принимает в качестве указателя на данные именно простые знаковые чары? Вроде же возможна потеря данных ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 10:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? (C++):

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*') - C++
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

Преобразовать const unsigned char* в std::string (или _bstr_t ) - C++
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned char*. а мне нужно получить ...

Приведение типов unsigned char[2] to unsigned char [64] - C++
Добрый день! Подскажите пожалуйста, как поступить. Есть простая функция main int main() { SHA1Context sha; uint8_t...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

IntelliSense: отсутствует оператор "<<", соответствующий этим операндам типы операндов: std::basic_ostream<char, std::char_traits<char> - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct Stydent { std::string faculty; int rate; ...

6
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 11:13 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от newbie666 Посмотреть сообщение
байт - это значение от 0 до 255
Не так. Байт - это 8 бит. И правило интерпретации этих бит может быть совершенно различным: 0..255, -128..127 ... это из популярных. Но в общем случае - это всего лишь 256 различных значений.
Указатель на char, равно как и unsigned char, как и signed char совершенно равноправно могли бы быть типами в качестве типа первого аргумента write, т.к. все они позволяют максимально возможно указывать на данные и смещаться по ним с минимальным адресуемым приращением (как должно быть известно - минимальная единица адресации это байт).
Никакой потери данных не будет, т.к. размеры всех char'ов одинаковые sizeof(char)==sizeof(signed char)==sizeof(unsigned char)==1. Весь вопрос лишь в том, как интерпретировать данные. О чем я сказал в самом начале.
2
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
06.05.2014, 11:25 #3
Цитата Сообщение от newbie666 Посмотреть сообщение
а не в простой char
простой char может быть определен реализацие как signed, так и unsigned. В стандарте C надо поискать где об этом говорится
0
newbie666
Заблокирован
06.05.2014, 11:30  [ТС] #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Не так. Байт - это 8 бит. И правило интерпретации этих бит может быть совершенно различным: 0..255, -128..127 ... это из популярных. Но в общем случае - это всего лишь 256 различных значений.
ну тога не совсем понятно, вот есть у меня переменная типа unsigned char:
C++
1
unsigned char X = 0xC8;
в функции write - указатель на данные типа char, значит когда я передаю в функцию write свою переменную на запись:
C++
1
write(char*)&X, 1);
, то моя переменная (равная в dec = 200) этой функцией преобразуется в простой char, а поскольку в простом знаковом чаре не может быть больше 127 - то моя переменная как бы прокручивается (смещается) и получается какое - то отрицательное число вместо исходных моих 200-ста и так и записывается в в бинарный файл, мне в принципе не важно, что она там так записалась, потому, что при чтение, я прочитаю это число в опять же обычный char и зная, что оно у меня там должно быть как бы в ансайн чаре - преобразую его обратно в своей беззнаковый чар и получаю корректное нужное мне число. Верно?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 11:35 #5
Цитата Сообщение от Croessmah Посмотреть сообщение
простой char может быть определен как signed, так и unsigned.
char, signed char и unsigned char это три различных типа.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
     
void f(char c)
{
    std::cout << "char\n";
}
     
void f(unsigned char c)
{
    std::cout << "unsigned char\n";
}
     
void f(signed char c)
{
    std::cout << "signed char\n";
}
     
int main() {
     
    unsigned char uc;
    char c;
    signed char sc;
    f( uc );
    f( c );
    f( sc );
     
    return 0;
}
http://ideone.com/sCkNYb

Другое дело, что в конкретной ОС char может представлять либо значения unsigned char, либо signed char.
Цитата Сообщение от Croessmah Посмотреть сообщение
В стандарте C надо поискать где об этом говорится
Поэтому в стандарте об этом ничего не сказано. Ну, может быть только, что implementation defined

Добавлено через 2 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
и так и записывается в в бинарный файл
Записывается побитовая копия байта. Как ее интерпретировать - дело десятое.
Цитата Сообщение от newbie666 Посмотреть сообщение
Верно?
Верно.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
06.05.2014, 11:36 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Tulosba Посмотреть сообщение
это три различных типа.
я к тому что
Цитата Сообщение от Tulosba Посмотреть сообщение
что в конкретной ОС char может представлять либо значения unsigned char, либо signed char.
поэтому забив строго unsigned char * мы получим жесткую привязку, хотя не вижу в этом ничего страшного - в любом случае это 1 байт
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну, может быть только, что implementation defined
именно. Так же есть сноска как отличить определяется char как signed или unsigned
CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.
1
newbie666
Заблокирован
06.05.2014, 11:40  [ТС] #7
---

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
поэтому забив строго unsigned char * мы получим жесткую привязку, хотя не вижу в этом ничего страшного - в любом случае это 1 байт
всё встало на свои места, спасибо!
По сути же пишутся биты как бы и тут главное размер, а не интерпретация, интерпретировать эти биты можно как угодно же... Вот я нубарь ахаха Всем спасибо
0
06.05.2014, 11:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 11:40
Привет! Вот еще темы с ответами:

Неверная конверсия из char* в unsigned char* - C++
Здравствуйте. Почему-то ловлю ошибку, гласящую о том, что не удалась конверсия из char* в *unsigned char*. Не понимаю, почему она вылазит?...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Совместимость char и unsigned char - C++
Есть некие числа в виде unsigned char. Есть строка в виде массива char (которая потом сбрасывается в файл с помощью fputs). В программе...

Unsigned char * в char * и наоборот - C++
Здравствуйте!помогите перевести unsigned char * в char * и наоборот без использования printf


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru