С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 1
Регистрация: 17.02.2018
Сообщений: 6

ifstream VS2019

17.03.2021, 13:14. Показов 2258. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день ув. форумчане.

Написал код для чтения данных в бинарном виде. После попадания на байт в файле 0х00 - начинает читать не правильно.
В условие я никогда не попадаю.
Файл имеет вид:

Code
1
43 47 46 03 A7 00 08 02 01 00 BA 1D 00 00 AD C2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 94 B2
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>     // std::cout
#include <fstream>      // std::ifstream
 
using namespace std;
 
int main()
{
 
    ifstream f("in.bin", ifstream::binary | ifstream::in);
    if (f)
    {
        char x = 0;
 
        for (unsigned char i = 0; i < 32; i++)
        {
            f.get(x);
            cout << (int)x << ' ';
        }
 
        f.close();
 
        if (x == 0xB2)
            cout << "OK" << endl;
        cin >> x;
 
    }
    return 0;
}
Вывод:
Code
1
67 71 70 3 -89 0 12 2 1 0 92 29 0 0 -100 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -15 -86
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2021, 13:14
Ответы с готовыми решениями:

В чем разница между ifstream и ifstream fin?
Помогите, пожалуйста, разобраться, в чем разница между ifstream и ifstream fin?

Различия ifstream::get() и ifstream::get(ch)
Доброго времени суток. Была тут тема, в которой я не разобрался до конца. Код ниже проверяет баланс скобок в текстовом файле #include...

Ошибка в VS2019 с инициализацией
В VS2017 всё нормально, в VS2019 int N не инициализирована. Думаю, из-за while, но это не точно. Объясните, что не так пожалуйста))) ...

11
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.03.2021, 13:57
Цитата Сообщение от Sqvood Посмотреть сообщение
начинает читать не правильно.
И что там неправильного?
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.03.2021, 13:59
Лучший ответ Сообщение было отмечено Sqvood как решение

Решение

Sqvood,
C++
22
if (x == (char)0xB2)
Или
C++
22
if ((unsigned char)x == 0xB2)
У Вас получилось сравнение 0xFFFFFFB2 vs 0x000000B2

Добавлено через 1 минуту
Пользуйтесь отладчиком... Крайне рекомендую...
1
0 / 0 / 1
Регистрация: 17.02.2018
Сообщений: 6
17.03.2021, 14:14  [ТС]
Цитата Сообщение от zayats80888
И что там неправильного?
После первого нуля в файле 0x08 - вывод 0xC0 ( int - 12 ).
liv,
C++
1
2
3
4
5
6
7
        if (x == 0xB2)
            cout << "OK" << endl;
        if ((unsigned char)x == 0xB2)
            cout << "OK" << endl;
        if (x == (char)0xB2)
            cout << "OK" << endl;
        cin >> x;
Результат тот же, не поменялся.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.03.2021, 14:35
Лучший ответ Сообщение было отмечено Sqvood как решение

Решение

Sqvood, у меня выводит так:

1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.03.2021, 14:44
Соответственно, (0xB2 = -78) != -86. Поэтому и не срабатывает равенство на 0xB2
Очень странно, почему вводятся такие числа...
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.03.2021, 15:09
Цитата Сообщение от Sqvood Посмотреть сообщение
После первого нуля в файле 0x08 - вывод 0xC0 ( int - 12 ).
А если так прочитать, что выведет?
C++
1
2
3
4
char buf[32];
f.read(buf, 32);
for(int i = 0, count = f.gcount(); i < count; ++i)
    std::cout << int(buf[i]) << ' ';
1
0 / 0 / 1
Регистрация: 17.02.2018
Сообщений: 6
17.03.2021, 15:37  [ТС]
То же самое. Пример файла я привел уже в 16-тирическом формате.
Т.е. если написано 03, то это соответствует - 0b00000011 или ETX, или Конец «текста»
Данные идут в файле без пробелов.
Т.е. как-то так, копипаст обрезал символы, но суть думаю понятна будет:
Code
1
CGF§��є��­В��������������”І
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.03.2021, 15:46
Цитата Сообщение от Sqvood Посмотреть сообщение
То же самое.
Ну значит в файле это и записано.
Цитата Сообщение от Sqvood Посмотреть сообщение
Данные идут в файле без пробелов.
А, так вы данные в файл записываете текстом
Так не работает, т.к. текст использует кодировку.
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.03.2021, 15:54
Sqvood, приложите свой файлик
1
0 / 0 / 1
Регистрация: 17.02.2018
Сообщений: 6
17.03.2021, 18:47  [ТС]
liv,
После Ваших слов, я начал понимать что я и***т ... я действительно попутал файлы. Чуть-чуть другой версии был. Правильно читает данные. Извините, тупанул.
Подскажите, как вообще правильно вычитать бинарные данные, через new char[ ], или просто указатель на массив char.
Или иным способом? Файлик порядка 7кБ...

Добавлено через 2 часа 14 минут
А можно ли считать данные не как signed char, a unsigned char?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
17.03.2021, 18:57
Цитата Сообщение от Sqvood Посмотреть сообщение
А можно ли считать данные не как signed char, a unsigned char?
Никто вам не запрещает. В чем проблема?

Читайте, например,

C++
1
int i = f.get();
и, если чтение прошло успешно, затем приводите

C++
1
unsigned char x = i;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2021, 18:57
Помогаю со студенческими работами здесь

Функция gets не работает в VS2019
функция gets не работает в vs 2019, это можно как-то исправить?

VS2019 - странная работа консоли
Здравствуйте, Что то консоль в VS2019 странно себя ведет. Для примера запускаю этот код: #include &lt;Windows.h&gt; int...

При компиляции в VS2019 выводит ошибку
При компиляции программы у меня выводит ошибку. Как исправить ошибку? #include &lt;iostream&gt; #include &lt;string&gt; ...

График пропадает сразу же после построения VS2019
#include &lt;Windows.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #define graphic(x) (sin(x)) int main(void) { float x; HDC...

VS2019 - не создает исполняемый-файл для release
Здравствуйте, Извините, подскажите пожалуйста, кто нибудь сталкивался с такой &quot;проблемой&quot;: VS2019 не создает exe-файл...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru