![]() |
Бинарные файлы
Решено
|
Цитата:
Цитата:
В паскале рекомендую использовать array of char, в c++ vector<unsigned char> |
Код:
// с |
.::.DIMA.::., fread нет необходимости знать структуру
К примеру по ссылке можно добавить следующий код, что б увидеть, а что хоть считало Код:
/* the whole file is now loaded in the memory buffer. */ В случае с fprintf / fscanf нужно задавать параметр считывания, впрочем можно ведь задать как unsigned char, а уже в цикле как по приведённом выше коде, распознать что есть что. pva, в случаи символа, как наименьшего элемента файла, один символ = один байт. А вот в случаи с UNICODE текста - один печатный символ уже не один байт. |
Цитата:
Код:
struct row_t { |
pva насчёт юникода, тут есть пользовательский момент: если воспользоваться примером выше для чтения файла сохранённого в Юникоде, то после каждого символа будут пробелы (текст на английском, для других языков не проверял). Это удивит пользователя, который не будет наблюдать последних при просмотреть через блокнот. В этом случаи, как я понимаю, или самостоятельно убирать пробелы, или же юзать юникод версии функций чтения/записи и соответственные пользовался переменными типа wchar_t.
Хорошо что привели структуру, хотелось бы её обсудить. Если её натравить на любой текстовый файл, то вывод будет в виде абракадабры Цитата:
Цитата:
И дело тут не в режиме открытия t/b, которые отличаются только тем, что в первом случаи перевод каретки (Ентер) и новая строчка это один символ, а во втором два отдельных, а в том что так оно устроено. Собственно сама программа чтения/записи, с использованиям приведённой структуры. Поля, да и сама структура, используются явно не по назначению, приведено только для примера. Код:
#include <stdio.h> Цитата:
При отладки в некоторых средах может появляется сообщение о разрушении стека возле переменной row1. Цитата:
Причём то что далее по тексту идёт затирание чрез i (для того что б убедится что данные берутся именно из файла) всех элементов структуры и элементов массива (от 0 до 10 не включая 10) row1 среда не находит проблемным. Структуры удобны в обработке, но в текстовом виде данные в файлы не сохранишь. Или всё же можно? |
Цитата:
Цитата:
Цитата:
Цитата:
Пример: запускаем FAR, создаём в нём текст, который содержит ровно 20 строк ровно по 8 + 100 + 255 = 363 символа (пробела). Включаем режим замены (нажимаем INSERT) и заполняем полученные строки (так чтобы длина строки оставалась 363, а "пустые" символы заполнялись пробелами) Начиная с каждого 0 символа строки пишем ID, с каждого 8 name, со 108 - description. На вид получится красивая выровненная табличка. Сохраняем файл и подаём в качестве аргумента к программе. Должно отработать красиво. Конечно же не оптимально хранить данные в таких файлах, где много пробелов, тем не менее, бывают случаи когда это самое элегантное решение, не требующее сложной обработки данных. Например рассмотрим телефонную станцию, после каждого звонка выдаёт следующие строчки: 1. дата (8 симв, ддммгггг) 2. время (6 символов ччммсс) 3. исходящий номер (11 симв) 4. входящий номер (11 симв) 5. время разговора (4 симв) 6. стоимость разговора (10 симв) вот в таком виде: Код:
220420092259148916342111189076958093 120 4500 Код:
// думаю причина в использовании аргумента %s с не Null-terminated string |
pva, это про то, как с точки зрения пользователя будет работать программа, читающие так текстовые файлы.
Опять использовал пользовательскую терминологию, на экране он видит пробелы. Спасибо за ликбез, буду знать - "байт 0". Говоря "сырые" я использую терминологию применяемую Харви и Полом Дейтелем, может быть дело в переводе. Тогда мне не понятно, почему находясь в памяти компьютера эти данные имеют читабельный вид, а сохраняясь в файл преображаются в не читаемый вид? А почему именно 20? У нас ведь массив на Чёткость не меньше/не больше, в данном случаи в файле 20 строк, не совсем согласуется с тем, что данные в файле могут свободно обновляться, в том числе сторонней программой, например через блокнот пользователём. К сожалению отображение не получилось Код:
#include <stdio.h> |
Цитата:
Код:
union Цитата:
Цитата:
Цитата:
|
pva, возможно покажусь назойливым, но всё же, возможно ли структуру в читабельном виде сохранить в файл, что б при чтении обратно программа понимала что это структура? В примерах про структуры показывается что нет - только бинарное представление.
В каких случаях стоит использовать union(объединение)? Это ведь таже структура, только более щадящая память за счёт размещения всех полей по одному и тому же адресу. Вместо пробелов всё же хочется задействовать табуляцию. В качестве примера я взял предыдущий - про телефонную станцию. Вот её структура Код:
struct PhoneStatistic Визуально всё хорошо получается (используя printf), да вот возникает сложность сбора данных в поля структуры. Используя printf можно в цикле выводить символы, при этом на экране складывается слово. По идеи, тоже самое можно сделать для полей структуры через sprintf. Да вот не задачка, не проходит. stdout это стандартный поток вывод, а stdin - ввода. Возможно, ли каким-то образом используя их комбинацию заполнять поля структуры данными выводимыми printf'ом? То есть что б они брались с экрана? Возможно ли во время выполнения программы узнать количество полей/элементов структуры? Так как в программе приходится за каждым элементом закреплять свой цикл. Отличие, от данных которые привёл pva выше - в добавленной табуляции между полями + новое поле. |
Цитата:
Кстати вместо назойливости я углядел желание докопаться до истины Цитата:
Цитата:
Цитата:
Код:
struct _runtime_info_entry {unsigned offset; unsigned size;}; |
pva спасибо за комплимент.
Цитата:
Код:
#include <stdio.h> В программе посимвольно проверяются данные, с помощью sprintf не выходит их складывать в переменную-элемент структуры. Да и к тому же нужно нуль символ учитывать. Да, так оно и будет Excel-> TSV.txt -> Program.exe |
Цитата:
функции printf, scanf - для форматированного ввода-вывода функции fread, fwrite - для двоичного. Некорректно ожидать, что вывод в цикле символов без разделителей пробелами функцией printf будет на ура воспринят функцие scanf (которая, к примеру, пробелами проверяет ограницы полей ввода). Ещё пример несовпадения интерфейсов: Код:
Массив чисел в нотации pascal: (1, 2, 3, 4, 5) |
Цитата:
|
они проверяют по сигнатурам, то есть есть шаблонные файлы типа регулярных выражений (regular expressions), которые выявляют наиболее характерные для вирусов в базе антивируса куски кода в экзешнике. А эвристический анализ разбирает исполняемый код и вычисляет вероятность того, что код может нанести компьютеру вред.
|
Время: 21:46. |
Время: 21:46.
© OSzone.net 2001-