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

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

Восстановить пароль Регистрация
 
newbie666
Заблокирован
06.05.2014, 10:53     Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ? #1
Ну собственно сабж...
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*) ?
Посмотрите здесь:

Ошибка 6 error C2664: strtok: невозможно преобразовать параметр 1 из "const char *" в "char *" C++
C++ Совместимость char и unsigned char
C++ const char и unsigned char
std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits<char>]» is protected C++
IntelliSense: отсутствует оператор "<<", соответствующий этим операндам типы операндов: std::basic_ostream<char, std::char_traits<char> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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*) ?
Еще ссылки по теме:

невозможно преобразовать параметр 1 из 'char' в 'const char *' C++
Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' C++
C++ Приведение типов unsigned char[2] to unsigned char [64]

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

Или воспользуйтесь поиском по форуму:
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*) ?
Ответ Создать тему
Опции темы

Текущее время: 02:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru