Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

Ну собственно сабж...
C++
1
2
std::fstream fs;
fs.write((char*)..)
В случае бинарного потока я допустим пишу байты функцией write, как известно, байт - это значение от 0 до 255, то есть от 0 до FF, этот диапазон укладывается в unsigned char, а не в простой char, так почему же эта функция принимает в качестве указателя на данные именно простые знаковые чары? Вроде же возможна потеря данных ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 10:53     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ?
Посмотрите здесь:
Преобразовать const unsigned char* в std::string (или _bstr_t ) C++
C++ Неверная конверсия из char* в unsigned char*
C++ Совместимость char и unsigned char
C++ const char и unsigned char
C++ Unsigned char * в char * и наоборот
Типы данных - где нужно использовать char, а где unsigned char? C++
std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits<char>]» is protected C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 11:13     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #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. Весь вопрос лишь в том, как интерпретировать данные. О чем я сказал в самом начале.
Croessmah
Модератор
Эксперт CЭксперт С++
13053 / 7316 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
06.05.2014, 11:25     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #3
Цитата Сообщение от newbie666 Посмотреть сообщение
а не в простой char
простой char может быть определен реализацие как signed, так и unsigned. В стандарте C надо поискать где об этом говорится
newbie666
Заблокирован
06.05.2014, 11:30  [ТС]     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #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 и зная, что оно у меня там должно быть как бы в ансайн чаре - преобразую его обратно в своей беззнаковый чар и получаю корректное нужное мне число. Верно?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 11:35     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #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 Посмотреть сообщение
Верно?
Верно.
Croessmah
Модератор
Эксперт CЭксперт С++
13053 / 7316 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
06.05.2014, 11:36     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 11:40     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ?
Еще ссылки по теме:
C++ Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
Hex в unsigned char C++
C++ unsigned char 0....255?!
C++ Unsigned char to vector
C++ Работа с unsigned char

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

Или воспользуйтесь поиском по форуму:
newbie666
Заблокирован
06.05.2014, 11:40  [ТС]     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #7
---

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
поэтому забив строго unsigned char * мы получим жесткую привязку, хотя не вижу в этом ничего страшного - в любом случае это 1 байт
всё встало на свои места, спасибо!
По сути же пишутся биты как бы и тут главное размер, а не интерпретация, интерпретировать эти биты можно как угодно же... Вот я нубарь ахаха Всем спасибо
Yandex
Объявления
06.05.2014, 11:40     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ?
Ответ Создать тему
Опции темы

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