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

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

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

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

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

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

У меня просто VS 2017.
Результат такой:
Скриншот показываю чтобы было видно что варнингов нет (ну, цвет такой вот))
Изображения
Тип файла: jpg кадр_10.jpg (77.0 Кб, 143 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 01.11.2018, 13:16   #12
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы не понимаете где тип и где не тип в С касте?
Каст - это приведение к типу? Так?
Я сразу начал изучение с С++.
Получается что
Код:
ofs2.open((char *)&bg1, sizeof(building));
Это то же самое что и
Код:
file.read(reinterpret_cast<char*>(&pers), sizeof(pers));	// считать данные о первом человеке
?

Последний раз редактировалось KAMLS; 01.11.2018 в 13:20.
KAMLS вне форума Ответить с цитированием
Старый 01.11.2018, 13:48   #13
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Правильно ли я понимаю, что приведение к типу чар, это форма организации потока в формате типа чар как для сохранения в файл так и извлечения из него? И при воссоздании бинарный код становится тем чем был до упаковки в бинарный файл?
То есть стринг стрингом дабл даблом и т.д.
KAMLS вне форума Ответить с цитированием
Старый 01.11.2018, 14:12   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Каст - это приведение к типу? Так?
В общем - да.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Я сразу начал изучение с С++.
Тогда надо сразу привыкать и писать С++ касты.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Это то же самое что и
Нет. Не тоже самое. C - это безусловный, безпроверок каст "во что угодно". Для reinterpret_cast есть описания https://en.cppreference.com/w/cpp/la...interpret_cast. Есть еще конст, статик и т.д. касты.
Конечно, каст к чарам не даст различий, но знать надо.

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

Цитата:
Сообщение от KAMLS Посмотреть сообщение
И при воссоздании бинарный код становится тем чем был до упаковки в бинарный файл?
Нет упаковки. Просто берется область памяти и пишется, потом берется и читается.

Цитата:
Сообщение от KAMLS Посмотреть сообщение
То есть стринг стрингом дабл даблом и т.д.
Главное, чтобы выравнивания и прочие мелочи совпали...
p51x вне форума Ответить с цитированием
Старый 01.11.2018, 14:28   #15
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо. Буду думать.
Сформировал уже 7 различных примеров записи в бинарный файл и считывания с него. Конечно беру с интернета, ковыряю что-то меняю для эксперимента читаю сам и по вашим советам, в общем и целом картина постепенно формируется, но конечно изучать еще много.
Есть один пример, который почему-то не работает. Можете подсказать почему?
Код:
#include <iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<Windows.h>
#include<conio.h>
#include <cstdlib>

using namespace std;

///////////////////////////////////////////////////////////
int main()
{
	setlocale(LC_CTYPE, "rus");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
int n, i;
double a;
FILE *f; //описываем файловую переменную
fopen_s(&f,"C://Papka//test3.dat", "wb"); //создаем файл в режиме записи 
cout << "n = "; 
cin >> n;//ввод числа n
//fwrite(&n, sizeof(int), 1, f);
for (i = 0; i < n; i++)//цикл для ввода n вещественных чисел
{
	cout << "a = ";
	cin >> a;//ввод очередного вещественного числа
	fwrite(&a, sizeof(double), 1, f);//запись вешественного числа в файл
}
for (i = 0; i < n; i++)//цикл для вывода n вещественных чисел
{
	int g=fread(&a, sizeof(double), 1, f);//считывание вешественного числа в консоль
	printf("%d", g);
}
fclose(f);//закрываем файл
_getch();
return 0;
}
Выводит две единицы вместо веденных значений.
Изображения
Тип файла: jpg кадр_11.jpg (47.0 Кб, 77 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 01.11.2018, 14:30   #16
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Сначала были даблы переделал на инты
Изображения
Тип файла: jpg кадр_12.jpg (49.2 Кб, 144 просмотров)

Последний раз редактировалось KAMLS; 01.11.2018 в 14:35.
KAMLS вне форума Ответить с цитированием
Старый 01.11.2018, 14:50   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вообще-то fread возвращает сколько он прочитал, а не что...

И, да, при использовании "/" в путях его экранировать не надо.
p51x вне форума Ответить с цитированием
Старый 01.11.2018, 15:12   #18
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И, да, при использовании "/" в путях его экранировать не надо.
Cпасибо.

Цитата:
Сообщение от p51x Посмотреть сообщение
Вообще-то fread возвращает сколько он прочитал, а не что...
Спасибо.
Есть две в общем то похожие по сути программы.
Эта, сохраняет в файл структуру, считывает и выводит.
Код:
#include <stdio.h> // подключаем функции дл работы с файлами
#include <conio.h> // подключам getch
#define _CRT_SECURE_NO_WARNINGS
struct int_double // в файл будем записывать пакеты
{
	int i;
	double d;
};

int main(int argc, char* argv[])
{
	int_double pack; // пакет
	FILE *f; // переменная для работы с файлом
	int i; // счётчик
	fopen_s(&f,"C:/Papka/test2.dat", "ab+"); // открываем бинарный файл для записи и чтения в режиме добавления, то есть, если файла нет, то он создастся, а если файл есть, то содержимое файла не будет уничтожено, из файла можно будет читать и в файл можно будет записывать
	pack.i = 0; // инициализация пакета
	pack.d = 0.0;
	for (i = 0; i < 10; i++) // запишем в файл в цикле 10 пакетов
	{
		pack.i = pack.i + 1;
		pack.d = pack.d + 11;
		fwrite(&pack, sizeof(int_double), 1, f); // записываем в файл f ровно 1 пакет pack размера int_double 
	}
	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
	printf("%d %f", pack.i, pack.d); // выводим 5-й пакет (5 55.0) на экран
	_getch(); // ожидаем нажатия пользователем клавиши
	fclose(f); // закрываем файл
	return 0; // возвращаем 0 - правило хорошего тона
}
Вот эта, должна делать то же самое с простыми числами. Но не делает. не пойму почему.
Скажите пожалуйста, в чем причина?
Код:
#include <iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<Windows.h>
#include<conio.h>
#include <cstdlib>

using namespace std;

///////////////////////////////////////////////////////////
int main()
{
	setlocale(LC_CTYPE, "rus");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
int n, i;
double a;
FILE *f; //описываем файловую переменную
fopen_s(&f,"C:/Papka/test3.dat", "wb"); //создаем файл в режиме записи 
cout << "n = "; 
cin >> n;//ввод числа n
for (i = 0; i < n; i++)//цикл для ввода n вещественных чисел
{
	cout << "a = ";
	cin >> a;//ввод очередного вещественного числа
	fwrite(&a, sizeof(double), 1, f);//запись вешественного числа в файл
}
for (i = 0; i < n; i++)//цикл для вывода n вещественных чисел
{
	fread(&a, sizeof(double), 1, f);//считывание вешественного числа в консоль
	printf("%f", a);
}
fclose(f);//закрываем файл
_getch();
return 0;
}
KAMLS вне форума Ответить с цитированием
Старый 01.11.2018, 15:23   #19
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы после записи курсор на начало файла не переставляете.
p51x вне форума Ответить с цитированием
Старый 01.11.2018, 15:54   #20
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо.
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