Заблокирован
1

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

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

Студворк — интернет-сервис помощи студентам
Ну собственно сабж...
C++
1
2
std::fstream fs;
fs.write((char*)..)
В случае бинарного потока я допустим пишу байты функцией write, как известно, байт - это значение от 0 до 255, то есть от 0 до FF, этот диапазон укладывается в unsigned char, а не в простой char, так почему же эта функция принимает в качестве указателя на данные именно простые знаковые чары? Вроде же возможна потеря данных ...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2014, 10:53
Ответы с готовыми решениями:

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;,...

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

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

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

6
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2014, 11:13 2
Лучший ответ Сообщение было отмечено Ev[G]eN как решение

Решение

Цитата Сообщение от 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
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
06.05.2014, 11:25 3
Цитата Сообщение от newbie666 Посмотреть сообщение
а не в простой char
простой char может быть определен реализацие как signed, так и unsigned. В стандарте C надо поискать где об этом говорится
0
Заблокирован
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
06.05.2014, 11:36 6
Лучший ответ Сообщение было отмечено newbie666 как решение

Решение

Цитата Сообщение от 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
Заблокирован
06.05.2014, 11:40  [ТС] 7
---

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

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

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

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

Сложности при конвертации из char в unsigned char *
Народ, всем привет, Необходимо конвертировать массив данных типа char production_data в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru