Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Бинарные файлы

Ответить
Настройки темы
C/C++ - Бинарные файлы

Новый участник


Сообщения: 21
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: .::.DIMA.::.
Дата: 16-03-2013
Решено

Отправлено: 12:52, 20-04-2009

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Admiral:
возможно покажусь назойливым, но всё же, возможно ли структуру в читабельном виде сохранить в файл, что б при чтении обратно программа понимала что это структура? »
Если выгружать память (без обработки), а структура содержит непечатные символы, то нельзя. Если загружать-выгружать память, нужно понимать что прявя файл правишь (а соответственно нарушаешь) память программы. Если программа в памяти старается держать читабельный текст (например использовать не Null-terminated strings а space-padded strings)
Кстати вместо назойливости я углядел желание докопаться до истины
Цитата Admiral:
Используя printf можно в цикле выводить символы, при этом на экране складывается слово. По идеи, тоже самое можно сделать для полей структуры через sprintf. Да вот не задачка, не проходит. »
Не понял мысль
Цитата Admiral:
То есть что б они брались с экрана? »
потоки ввода-вывода наоборот сделаны так, чтобы можно было работать без экрана, например с файлом. И тут надо договориться как вы воспринимаете входящй поток. Либо как текст (в удобном для человека виде), либо как данные (данные уже поступают в таком виде, в котором коду "удобно" с ними работать). Насколько я понял речь скорее идёт о использовании конвейеров: c:> someprogram1.exe | someprogram2.exe
Цитата Admiral:
Возможно ли во время выполнения программы узнать количество полей/элементов структуры? Так как в программе приходится за каждым элементом закреплять свой цикл »
Если не держать информацию о структуре данных в программе, то нельзя. Язык c/c++ не поддерживает эту возможность. Можно поступить так:
Код: Выделить весь код
struct _runtime_info_entry {unsigned offset; unsigned size;};

struct data1
{
    char a[10], b[20], c[35];
    static const _runtime_info_entry* info;
}

_runtime_info_entry* data1::info = {{0,10},{10,20},{30,35},{0,0}};

// вариант для C
void load(void* data, const _runtime_info_entry* info)
{
   for(; info->size!=0; ++info)
  {
     fread(reinterpret_cast<char*>(data) + info->offset, info->size, stdin);
  }
}

// вариант для C++, вообще сомнительный конечно, потому что не безопасный
template<typename Struct1>
void load(Struct1& data, filebuf& buf)
{
   char* data_ptr = reinterpret_cast<char*>(&data);
   const _runtime_info_entry* info = Struct1::info;
  
   for(; info->size!=0; ++info)
  {
     fill(data_ptr + buf.sgetn(data_ptr + info->offset, info->size), data_ptr + info->size, ' ');
  }
}
а ещё можно использовать виртуальную функцию virtual data1::info(), которая возращает информацию об объекте (так делается в QT), но мне всё-таки кажется лучше определить функции load() и save().
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:41, 27-04-2009 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


pva спасибо за комплимент.
Цитата pva:
Не понял мысль »
Код: Выделить весь код
#include <stdio.h>

int main(int argc, char* argv[])
{
	int i=0;
	char HW [11+1]="Hello World";

	while (HW[i]!='\0')
	{
		printf("%c",HW[i]);
		i++;
	}
	printf("%s",HW);
	return 0;
}
В программе дважды выведена строчка Hello World, первый раз как символьный массив, второй раз как строчка с помощью указателя.
В программе посимвольно проверяются данные, с помощью sprintf не выходит их складывать в переменную-элемент структуры. Да и к тому же нужно нуль символ учитывать.

Да, так оно и будет Excel-> TSV.txt -> Program.exe

Последний раз редактировалось Admiral, 27-04-2009 в 20:34.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:23, 27-04-2009 | #12

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Admiral:
В программе посимвольно проверяются данные, с помощью sprintf не выходит их складывать в переменную-элемент структуры »
Потому что надо договариваться об интернтерфейсе между программами. Если вывод одной программы - форматированный текст, значит программа, которая этот вывод читает, должна пользоваться функциями форматированного текста. Если вывод - поток двоичных данных, программа читающая должна воспринимать их как двоичные данные. Пример:
функции printf, scanf - для форматированного ввода-вывода
функции fread, fwrite - для двоичного.
Некорректно ожидать, что вывод в цикле символов без разделителей пробелами функцией printf будет на ура воспринят функцие scanf (которая, к примеру, пробелами проверяет ограницы полей ввода).
Ещё пример несовпадения интерфейсов:
Код: Выделить весь код
Массив чисел в нотации pascal:  (1, 2, 3, 4, 5)
Массив чисел в нотации c/c++: {1, 2, 3, 4, 5}
Строчка данных в файле csv:   1; 2; 3; 4; 5
Строчка данных, воспринимаемая кодом (числа, разделённые пробелами короче)
copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter<int>(vector_of_int)) 
1 2 3 4 5
Как видите, одно и то же можно выразить разными способами. А чтобы передать данные, нужно чтобы операции чтения и записи пользовались одним языком (нотацией).

Отправлено: 09:46, 28-04-2009 | #13

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата .::.DIMA.::.:
и не зная её. »
это уж как повезёт. Можно угадать, а можно и нет. Вот например ни за что не догадаешься, как файл mp3 на экран выводить
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:44, 04-05-2009 | #14

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


они проверяют по сигнатурам, то есть есть шаблонные файлы типа регулярных выражений (regular expressions), которые выявляют наиболее характерные для вирусов в базе антивируса куски кода в экзешнике. А эвристический анализ разбирает исполняемый код и вычисляет вероятность того, что код может нанести компьютеру вред.
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:19, 05-05-2009 | #15



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Бинарные файлы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Не открываются текстовые файлы и изображения и к ним создались файлы с расшир. drweb leda Лечение систем от вредоносных программ 1 03-10-2009 01:22
[решено] Не удаляются неизвестные мне файлы fidbox.dat и fidbox.idx. Что это за файлы? segafos Лечение систем от вредоносных программ 31 04-06-2009 17:17
CMD/BAT - файлы вида mmdd*.* - для каждой даты нужно создать каталог, скопировать, файлы milito Скриптовые языки администрирования Windows 2 24-05-2009 23:32
Доступ - html-файлы грузятся как файлы для скачивания Dr. MefistO Microsoft Windows 2000/XP 1 08-03-2009 10:06
Файлы Surround Вебмастеру 4 28-03-2003 08:35




 
Переход