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

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

Войти
Регистрация
Восстановить пароль
 
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
#1

Как прочитать из бинарного файла тип НЕ *char - C++

01.05.2012, 13:56. Просмотров 872. Ответов 10
Метки нет (Все метки)

Понимаю, что ответ где-то на поверхности, но я уже задолбался искать. Гугл и все справочники, в которых я читал о функции read, приводят такой пример:
C++
1
2
memblock = new char [size];
file.read (memblock, size);
это все понятно, но как мне считать из бинарного файла значения в переменную, которая не является char'ом??? Никак не могу найти, как это сделать.

Добавлено через 1 минуту
Мне, например, нужно из файла считать структуры, в которых хранятся разные значения типов int, double, char...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2012, 13:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как прочитать из бинарного файла тип НЕ *char (C++):

Как прочитать числа из бинарного файла - C++
Нужна помощь. Пытаюсь читать из бинарного файла простые числа, но ничего не читается. Файл взят тут, там же и его описание, через Hex...

Как прочитать заголовок бинарного файла в формате TIFF? - C++
нужно считать заголовок *.tif - файла... открываю как поток для чтения бинарного файла вот так: ifstream...

Прочитать из бинарного файла в 5 по 8 байты включительно - C++
что то непойму: Подскажите пожалуйста, как прочитать из бинарного файла байт (с 5 по 8 границы включены) * в виде потоков

Не могу прочитать с бинарного файла компонент - C++
Здравствуйте! Помогите, пожалуйста, совсем начинающему энтузиасту. Программа динамически создает определенный набор компонентов с...

Прочитать из бинарного файла байт номер 0 и отобразить его на дисплее в виде числа - C++
прочитать из бинарного файла байт номер 0 и отобразить его на дисплее в моем коде программа читает символ и на экране печатает аски...

Чтение бинарного файла: определить длину кодограммы вместе с заголовком, тип, и смещение - C++
Имееться бинарный файл с кодограммами и мусором.Каждая кодограмма начинаеться с АААА(16-ричный формат), 3-байт - мусор, 4 - тип. Нужно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
01.05.2012, 14:05 #2
преобразовать указатель в char*
C++
1
2
data = new some_struct_type;
file.read ((char*)data, sizeof(*data));
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
01.05.2012, 14:13  [ТС] #3
Цитата Сообщение от grizlik78 Посмотреть сообщение
преобразовать указатель в 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
struct scan_info{
    char model[25];
    int price; 
    double x_size; 
    double y_size; 
    int optr; 
    int grey; 
};
 
int main()
{
    ifstream fs (fileName, ios::binary);
    if (!fs.is_open())
    {
        cout << "Error. Unable to open file \"" << fileName << "\"" << endl;
        return;
    }
 
    scan_info scanner;
    fs.read ((char*)scanner,sizeof(scan_info));
    cout << "Model: " << scanner.model << endl;
    cin.get();
    return 0;
}
Происходит ошибка в строке fs.read ((char*)scanner,sizeof(scan_info));
1 IntelliSense: no suitable conversion function from "scan_info" to "char *" exists f:\study\oop\lab14\lab14\lab14\lab14.cpp 89 20 lab14
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
01.05.2012, 14:15 #4
потому что у меня data это указатель.
C++
1
fs.read ((char*)&scanner, sizeof(scan_info));
thick_int
Заблокирован
01.05.2012, 14:21 #5
Вот эту строку
C++
1
fs.read ((char*)scanner,sizeof(scan_info));
замените вот на эту:
C++
1
fs.read (reinterpret_cast<char const*>(scanner),sizeof(scan_info));
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
01.05.2012, 14:25  [ТС] #6
grizlik78, thick_int, спасибо! оба ваши примеры работают! А какая между ними разница?
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
01.05.2012, 14:34 #7
У меня преобразование в стиле Си, reinterpret_cast лучше показывает намерения программиста. Но ошибка-то у thick_int осталась, reinterpret_cast не сделает из объекта указатель, адрес в любом случае надо брать.
thick_int
Заблокирован
01.05.2012, 14:41 #8
Цитата Сообщение от grizlik78 Посмотреть сообщение
reinterpret_cast не сделает из объекта указатель, адрес в любом случае надо брать.
Все верно, просто забыл поставить амперсанд.
Окончательный вариант такой:
C++
1
fs.read (reinterpret_cast<char const*>(&scanner),sizeof(scan_info));
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
01.05.2012, 14:43 #9
Tolias28, ReadFile
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
01.05.2012, 14:45 #10
А я вот ещё раз посмотрел, и мне вдруг стало непонятно, зачем там const у указателя? Ведь функция read как раз должна изменять данные по этому указателю. Мой компилятор тоже возмутился.
Так что окончательный вариант тогда такой:
C++
1
fs.read (reinterpret_cast<char*>(&scanner),sizeof(scan_info));
thick_int
Заблокирован
01.05.2012, 15:03 #11
А это уже просто перепутал определения аргументов с функцией write.
Только что прочел эту тему (потоковый ввод и вывод в файлы). Естественно, что в голове пока полная каша.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2012, 15:03
Привет! Вот еще темы с ответами:

Как прочитать переменную const char? - C++
Здравствуйте! У меня возникла проблема при чтении текста. Как сделать так, чтобы человек ввел буквенное значение и оно записалось? ...

Как записать и прочитать int (4 byte) из char[] - C++
Buffer.h #ifndef BUFFER_CPP_H #define BUFFER_CPP_H #include &lt;vector&gt; template &lt;class T&gt; class Buffer { ...

Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR? - C++
Вроде давно занимаюсь программированием на С++, но встала проблема... Есть некий массив переменных имеющих 8 битный размер... без знака...

Не могу преобразовать тип char в тип double - C++
Вся загвоздка в str1 и str2; #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include&quot;stdlib.h&quot; #include &quot;cstdlib&quot; #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.05.2012, 15:03
Ответ Создать тему
Опции темы

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