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

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

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

Студворк — интернет-сервис помощи студентам
Ну собственно сабж...
C++
1
2
std::fstream fs;
fs.write((char*)..)
В случае бинарного потока я допустим пишу байты функцией write, как известно, байт - это значение от 0 до 255, то есть от 0 до FF, этот диапазон укладывается в unsigned char, а не в простой char, так почему же эта функция принимает в качестве указателя на данные именно простые знаковые чары? Вроде же возможна потеря данных ...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

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; freopen(fileName, &quot;r&quot;, stdin); while...

6
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2014, 11:13
Лучший ответ Сообщение было отмечено 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
Неэпический
 Аватар для Croessmah
18129 / 10713 / 2064
Регистрация: 27.09.2012
Сообщений: 27,006
Записей в блоге: 1
06.05.2014, 11:25
Цитата Сообщение от newbie666 Посмотреть сообщение
а не в простой char
простой char может быть определен реализацие как signed, так и unsigned. В стандарте C надо поискать где об этом говорится
0
Заблокирован
06.05.2014, 11:30  [ТС]
Цитата Сообщение от 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
Цитата Сообщение от 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
18129 / 10713 / 2064
Регистрация: 27.09.2012
Сообщений: 27,006
Записей в блоге: 1
06.05.2014, 11:36
Лучший ответ Сообщение было отмечено 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  [ТС]
---

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
поэтому забив строго unsigned char * мы получим жесткую привязку, хотя не вижу в этом ничего страшного - в любом случае это 1 байт
всё встало на свои места, спасибо!
По сути же пишутся биты как бы и тут главное размер, а не интерпретация, интерпретировать эти биты можно как угодно же... Вот я нубарь ахаха Всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2014, 11:40
Помогаю со студенческими работами здесь

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

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

Сделать преобразование 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 faculty; int rate; ...

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


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

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

Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru