Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2018, 07:31   #31
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо. Разобрался.
fflush(f); там не нужен. Ибо работа программы разнонаправленная. Сначала запись, после чтение. Читать не закрыв первый поток не получится. А закрыв первый поток fflush(f); не нужен, как и установка на начало файла fseek(s, 0, SEEK_SET);.
fflush(f); нужен как я понял из прочитанного при однонаправленном действии, сбросить буфер при чтении чтобы содержимое не мешало и продолжить читать, и то же самое при записи.
В целом спасибо, ориентироваться стал лучше в вопросе))
Пока не понял то, что в этом примере нет reinterpret_cast<char*>. Вообще про char нет намёка.
В других примерах:
Код:
file.read(reinterpret_cast<char*>(&pers), sizeof(pers));	// считать данные о первом человеке
Код:
while (!ifile.read((char*)&Note, sizeof(Notes)).eof()) // Считывать и отображать строки в цикле, пока не eof
Код:
ofs2.read((char *)&bg1, sizeof(building));
Код:
in.read((char*)&obj, sizeof(MyClass));
Хотя есть еще один пример без приведения к char:

Код:
fseek(f, 4 * sizeof(int_double), SEEK_SET); // перемещаемся от начала (SEEK_SET) файла f на 4 длинны пакета int_double, то есть к началу 5-го пакету
	fread(&pack, sizeof(int_double), 1, f); // считываем из файла f ровно 1 пакет pack размера int_double
Почему где-то приведение используется а где-то нет?

Последний раз редактировалось KAMLS; 03.11.2018 в 07:56.
KAMLS вне форума Ответить с цитированием
Старый 03.11.2018, 08:02   #32
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Давайте по другому:
Код:
file.read(reinterpret_cast<char*>(&pers), sizeof(pers));	// считать данные о первом человеке
и другие ваши примеры.
Вы размер для чтения в чем передаете? На сколько для записи следующего блока этого размера должен сдвинутся указатель? Какой указатель так двигается при инкременте?


Код:
fread(&pack, sizeof(int_double), 1, f); // считываем из файла f ровно 1 пакет pack размера int_double
Это С функция. Указатель здесь void. Т.е. После каждого чтения указатель просто увеличивается на размер.

Вы видели когда-нибудь пазл или лего? Вот представьте собрали фигуру и хотите ее перенести - фактически у вас два варианта:
1. взять какой-то стандарт (замер) для размера, например, 1 лист. померять, напихать нужное кол-во и перести
2. взять и по отдельным компонентам перенести

Последний раз редактировалось p51x; 03.11.2018 в 08:26.
p51x вне форума Ответить с цитированием
Старый 03.11.2018, 08:46   #33
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо, я так и понял что путаюсь в разнице подходов С и С++. Буду разбираться, направление получил))
KAMLS вне форума Ответить с цитированием
Старый 03.11.2018, 09:23   #34
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Есть такой код
Код:
#include <fstream>  // для файловых потоков
#include <iostream>
using namespace std; 
///////////////////////////////////////////////////////////
class person    // класс person
{ 
protected: 
char name[80];  // Имя человека
short age;  // его возраст
public: 
void showData()  // вывести данные
{ 
cout << "Имя: " << name << endl; 
cout << "Возраст: " << age << endl; 
} 
};
///////////////////////////////////////////////////////////
int main()
{ 
person pers;  // переменная типа person
ifstream infile("PERSON.DAT", ios::binary);// создать поток
// чтение потока
infile.read(reinterpret_cast<char*>(&pers), sizeof(pers)); 
pers.showData();  // вывести данные
return 0;
}
Правильно ли я понимаю, что созданный поток
Код:
infile
считывает с начала файла блок размером с объект
Код:
pers
Код:
sizeof(pers)
приводит считанное к типу чар (побайтово)
Код:
(reinterpret_cast<char*>
и побайтово присваивает по ссылке объекту
Код:
(&pers)
т.е. последовательно его полям.
KAMLS вне форума Ответить с цитированием
Старый 03.11.2018, 09:43   #35
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Ничего не приводит и не присваивает.

Вы ему передаете указатель на память и размер. Можете для начала считать, что все что он делает это:
Код:
for(size_t i = 0; i < SIZE; ++i)
  pointer[i] = readed_byte;
p51x вне форума Ответить с цитированием
Старый 03.11.2018, 10:54   #36
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Т.е. в файле содержатся не только поля объекта который в ОЗУ, но и структура объекта? Т.е. с файла считывается как с ОЗУ, и побайтово
Цитата:
Сообщение от p51x Посмотреть сообщение
pointer[i] = readed_byte;
по ссылке объект_память=объект_файл?
KAMLS вне форума Ответить с цитированием
Старый 03.11.2018, 11:01   #37
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Т.е. в файле содержатся не только поля объекта который в ОЗУ, но и структура объекта? Т.е. с файла считывается как с ОЗУ, и побайтово
Я ж уже писал, объект рассматривается как участок памяти и пишется. Что значит структура?

Цитата:
Сообщение от KAMLS Посмотреть сообщение
по ссылке объект_память=объект_файл?
Чего? Какой ссылке? Опять документацию не читаете?
Код:
std::size_t fread( void* buffer, std::size_t size, std::size_t count, std::FILE* stream );
Хде ссылка? Хде объект?
p51x вне форума Ответить с цитированием
Старый 03.11.2018, 11:45   #38
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
std::size_t fread( void* buffer, std::size_t size, std::size_t count, std::FILE* stream );
Это форма считывания или записи по С.
Я привел пример на С++ с использованием
Код:
reinterpret_cast<char*>(&pers)

Цитата:
Сообщение от p51x Посмотреть сообщение
Что значит структура?
В данном случае, структура - это макет объекта, как он описан в классе. Это в файл сохраняется?


Цитата:
Сообщение от KAMLS Посмотреть сообщение
reinterpret_cast<char*>(&pers),
Вот в этой фразе ссылка куда? На объект в файле (как последовательность байтов)? На объект в буфере (последовательность байтов считанная с файла)? На объект в ОЗУ на тот участок памяти где расположена загруженная программа (последовательность байтов в классе файла)?
KAMLS вне форума Ответить с цитированием
Старый 03.11.2018, 12:30   #39
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Это форма считывания или записи по С.
Я привел пример на С++ с использованием
Думаете это что-то сильно поменяет?
https://en.cppreference.com/w/cpp/io/basic_istream/read
Код:
basic_istream& read( char_type* s, std::streamsize count );
Тот же указатель и тот же размер... А забыл, вы же доки не читаете.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
В данном случае, структура - это макет объекта, как он описан в классе. Это в файл сохраняется?
Оо... а они различаются? Поля перемешиваются, да? Если вы про методы, то естественно, нет.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Вот в этой фразе ссылка куда?
Тут ссылки нет.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
На объект в файле (как последовательность байтов)?
А объект пишется прям в бинарик? Когда создаешь 100 векторов они все пишутся в бинарик сразу?

Цитата:
Сообщение от KAMLS Посмотреть сообщение
На объект в буфере (последовательность байтов считанная с файла)?
Каком буфере? Каких байтов, если вы только просите прочитать/записать? Подумайте и поймете, что несете бред. Это ВЫ даете функции указатель, куда она запишет данные или откуда прочитает. Как вы его получили, куда он указывает ей глубоко положить.

Цитата:
На объект в ОЗУ на тот участок памяти где расположена загруженная программа (последовательность байтов в классе файла)?
Зачем вы в одном предложении совмещаете ОЗУ и файл? Что такое класс файла?

Вот вы создаете массив:
Код:
int* a = new int[100];
Куда указывает a? В озу? В файл? В класс файла? В буфер?
p51x вне форума Ответить с цитированием
Старый 03.11.2018, 13:24   #40
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
int* a = new int[100];

Куда указывает a? В озу? В файл? В класс файла? В буфер?
Эта строка указывает в ОЗУ. Указатель на начальный адрес, с которого начинается массив указанного типа.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
На объект в ОЗУ на тот участок памяти где расположена загруженная программа (последовательность байтов в классе файла)?
Да, здесь ошибка, вопрос: На объект в ОЗУ, т.е. на тот участок памяти где расположена загруженная программа (последовательность байтов в объекте класса программы (расположенной в ОЗУ))?


Цитата:
Сообщение от p51x Посмотреть сообщение
Это ВЫ даете функции указатель, куда она запишет данные или откуда прочитает.
В начале страницы [4] этой темы работающая программа. Вопрос возник для улучшения понимания механики происходящего. Я изложил свою версию, как я понимаю. Может быть не очень точными для специфики программирования словами.
Код:
infile.read(reinterpret_cast<char*>(&pers), sizeof(pers));
В принципе вы сейчас к моему изложению и подводите.
Цитата:
Сообщение от KAMLS Посмотреть сообщение
и побайтово присваивает по ссылке объекту
Код:

(&pers)

т.е. последовательно его полям.
KAMLS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись объекта в файл Sheffdmb2010 Общие вопросы C/C++ 9 31.05.2013 19:54
Запись объекта в файл CodeNOT PHP 5 22.06.2011 13:15
Хранение в векторе объектов пользовательского класса jennya Visual C++ 4 03.10.2010 19:16
[PHP] Запись класса в файл Ramirag PHP 3 21.04.2010 00:40
Массив эллементов пользовательского класса windzor Общие вопросы .NET 4 02.03.2010 19:53