0 / 0 / 0
Регистрация: 01.03.2011
Сообщений: 32
1

Бинарные файлы

03.05.2011, 08:37. Показов 75383. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помочь с новыми задачками
Миниатюры
Бинарные файлы  
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.05.2011, 08:37
Ответы с готовыми решениями:

Бинарные файлы
В файле содержатся числа. Сформировать из них матрицу, содержащую пять элементов в строке. Лишние...

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

Бинарные файлы
Всё началось с необходимости наличия программы, в которую вводишь число и она говорит есть ли такое...

Бинарные файлы..
Доброго времени суток, господа! Возникла проблемка с открытием бинарного файла: char...

10
5 / 5 / 3
Регистрация: 06.12.2010
Сообщений: 50
03.05.2011, 09:18 2
Если у тебя есть конкретный вопрос можешь спрашивать, если ты просишь решить за тебя то сомневаюсь что кто нибудь станет за тебя это делать
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
03.05.2011, 09:40 3
Лучший ответ Сообщение было отмечено как решение

Решение

Ликбез по двоичным файлам:

Обычно различают текстовые и двоичные файлы. Текстовые файлы состоят из строк, которые завершаются символом конца строки. В программе на С++ этот символ обозначается как '\n'.

ПРИМЕЧАНИЕ
В системе Windows строки в текстовом файле завершаются комбинацией двух байтов 0x0D0A, поэтому при операциях ввода-вывода система выполняет преобразование.

Обычно операции обмена с текстовым файлом сопровождаются преобразованием информации аналогично тому, как это происходит для стандартных потоков. По нашей классификации, приведенной в начале главы, текстовые файлы являются форматируемыми. Форматирование не выполняется только в том случае, если содержимое текстового файла обрабатывается именно как символы и строки.

Двоичные файлы не разбиваются на строки, и никаких преобразований при обмене не выполняется — двоичные файлы не являются форматируемыми. Это, во-первых, означает, что операции обмена для двоичных файлов выполняются быстрее. Во-вторых, при операции записи в двоичный файл попадает ровно столько байтов, сколько записываемый объект занимает в памяти. Например, целое число, записанное в двоичный файл, займет на диске sizeof(int) байтов. Это существенно отличается от записи в текстовый файл, где количество записываемых по умолчанию символов зависит от величины числа. Например, число 12 в текстовом файле займет 2 или 3 байта (в зависимости от того, выводится ли число со знаком или без него), а 123 456 — 6 или 7 байт. Примером двоичного файла является исполняемый файл (с расширением exe).

Теперь легко написать программы обработки двоичных файлов. В первом примере мы создаем два двоичных файла из одного массива (листинг 14.7). Для сохранения двоичных файлов нужно создать на диске C каталог BinFiles.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Листинг 14.7. Создание и обработка двоичных файлов
#include <fstream>
#include <iostream>
#include <ctime>
using namespace std;
int main()
{    int m[10]={0};
    srand((unsigned)time(NULL));  // инициализация датчика случайных чисел
   /* заполняем массив m числами */
    for(int i = 0; i < 10; i++)
    { m[i] = rand()%10;
      cout << m[i] << ' ';                // контрольный вывод на экран
    }
    cout << '\n';
     /* открываем файл для записи */
    ofstream outstrm ("c:/binfiles/oonumber1.bin", std::ios::binary);
    if(outstrm.is_open())
    { for(int i = 0; i < 10; i++) // выводим массив в файл поэлементно
        outstrm.write((char *)&m[i], sizeof(int)); 
      outstrm.close();
    }
    /* открываем другой файл для записи */
    outstrm.open("c:/binfiles/oonumber2.bin", std::ios::binary);
    if(outstrm.is_open()) 
    { outstrm.write((char*)m, sizeof(m)); // выводим массив в файл 
      outstrm.close();
    }
// вывод двоичного файла на экран 
    // открываем второй файл для чтения 
    {   ifstream instrm ("c:/binfiles/oonumber2.bin", std::ios::binary);
        int a = 0;
        // читаем числа по одному из файла и выводим 
        while(instrm.read((char *)&a, sizeof(int))) 
            cout << a << ' ';
        cout << '\n';
    }
// открываем первый файл для чтения 
  ifstream instrm ("c:/binfiles/oonumber1.bin", std::ios::binary);
  int t[10] = {0};
  instrm.read((char *)t, sizeof(t));      // чтение файла в массив
  instrm.close();                         // закрываем
  for(int i = 0; i < 10; i++) 
        cout << t[I] << ' ';
  cout << '\n';  
 char ch = getchar();
return 0;
}
В этом примере два двоичных файла из одного массива создаются разными способами: в файл oonumber1.bin массив выводится поэлементно, а в файл oonumber2.bin — сразу целиком одним оператором. Если мы заглянем в каталог BinFiles, то увидим, что эти два файла имеют одинаковый размер в 40 байт.

Затем те же файлы открываются как входные, читаются и выводятся на экран. Сначала открывается файл oonumber2.bin (в который мы писали массив целиком), и чтение из него выполняется по одному числу. Нетрудно вместо вывода на экран выполнять в цикле, например, суммирование чисел, записанных в этот файл.

Первый файл oonumber1.bin, который записывался в цикле по одному числу, читается сразу целиком в массив t одним оператором, и поток тут же закрывается. И снова мы наблюдаем на экране, что чтение выполнено совершенно правильно. Такое «смешение» для двоичных файлов безопасно, так как и в памяти, и на диске размеры данных равны sizeof(тип) * n, где n — количество элементов, участвующих в обмене.

Копирование и дозапись двоичных файлов можно выполнить той же функцией filecopy() (см. листинг 14.4), открыв потоки как двоичные, например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Листинг 14.4. Копирование файлов
#include <fstream>
#include <ctime>
using namespace std;
// функция копирования потока in в поток out; потоки должны быть открыты
void filecopy(ifstream &in, ofstream &out)
{ char ch;
  while(in.get(ch))        // читать все символы, в том числе пробельные
    out.put(ch); 
}
int main()
{    ifstream instrm ("c:/textfiles/oonumber.txt");
     ofstream outstrm("c:/textfiles/oonumber.new");
     if (instrm) filecopy(instrm, outstrm); // копирование файлов
 return EXIT_SUCCESS;
}
C++
1
2
3
4
5
6
7
8
9
10
11
// копирование файлов
{ ifstream instrm ("c:/binfiles/oonumber1.bin", std::ios::binary);
  ofstream outstrm("c:/binfiles/oonumber.new", std::ios::binary);
  if (instrm) filecopy(instrm, outstrm);
}
// дозапись нового файла в конец старого
{ ifstream instrm ("c:/binfiles/oonumber2.bin", std::ios::binary);
  ofstream outstrm("c:/binfiles/oonumber.new",
                    std::ios::app|std::ios::binary);
  if (instrm) filecopy(instrm, outstrm);
}
Как и при обработке текстовых файлов, разница заключается только в режиме открытия.
Напишем программу сравнения двоичных файлов, чтобы убедиться, что файл oonumber2.bin совпадает с исходным файлом oonumber1.bin. Реализуем эту операцию в виде функции сравнения filecompare():
C++
1
bool filecompare(ifstream &first, ifstream &second);
Параметрами этой функции являются открытые потоки (как в функции filecopy()), а результат — булево значение, равное:
- true, если файлы идентичны;
- false, если файлы различаются.
Нам достаточно сравнить файлы побайтно, выдав значение false при первом различии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// функция сравнения файлов побайтно
bool filecompare(ifstream &first, ifstream &second)
{ char ch1 = 0, ch2;
  while (ch1 != EOF)
  { ch1 = first.get(); ch2 = second.get();
    if (ch1!=ch2) return false;
  }
  return true;
}
// ------------------------------------в главной программе...
ifstream first ("c:/binfiles/oonumber1.bin", std::ios::binary);
ifstream second("c:/binfiles/oonumber2.bin", std::ios::binary);
if(filecompare(first, second)) cout << "Files are equals!"<< endl;
else                            cout << "Files are not equals!" << endl;
Если файлы совпадают, программа выводит на экран строку

Files are equals!

Между прочим, эта же функция сравнения прекрасно работает с любыми текстовыми файлами, поскольку ввод информации осуществляется посимвольно.
23
kazak
03.05.2011, 13:09
  #4

Не по теме:

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
В системе Windows строки в текстовом файле завершаются комбинацией двух байтов 0x0D0A
мелочи, но 0x0A0D :)

2
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,707
Записей в блоге: 6
03.05.2011, 14:18 5
RAEman, отлично описал работу с двоичными файлами мистер Либерти. 536 страница книги С++ за 21 день.
2
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
01.08.2011, 12:21 6
А может кто то скажет какие символы используются для хранения например исполняемых файлов (весь Unicode или ASCII или д.) ???
0
3570 / 2717 / 348
Регистрация: 11.03.2009
Сообщений: 6,254
01.08.2011, 12:29 7
Вся информация в компьютере хранится в цифровом виде, конкретно в двоичном.
0
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
02.08.2011, 00:02 8
Я имел ввиду когда открываешь какой то .ехе файл с помощью текстового редактора там видно символы. Кодировка этих смволов??7
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
02.08.2011, 00:08 9
такая, какая выставлена в твоем редакторе.
0
2712 / 1328 / 254
Регистрация: 16.03.2008
Сообщений: 6,122
Записей в блоге: 2
02.08.2011, 00:58 10
Цитата Сообщение от smallvill Посмотреть сообщение
Я имел ввиду когда открываешь какой то .ехе файл с помощью текстового редактора там видно символы. Кодировка этих смволов??7
Та "кодировка" о которой вы говорите имеет смысл только в отношении текста. Утрировано говоря это таблица преобразования из кодов в "представление" той или иной буквы/символа.. В текстовом файле хранятся коды символов, эти коды используются как индексы втаблице преобразования. И пеуже при выводе на консоль компьютер знает как рисовать тот или иной символ. Если у компьтера в распоряжении окажется другая "таблица" символов. То вы на экране увидите абракатабру. Соответственно говорить о "кодировке" бинарного файла нет ни какого смысла. Для примера:
1 бинарный файл. Сохраняем значение переменной типа int. (Пусть она будет равна 0). В файле будет записано четыре (с оговоркой на архитектуру) байта: 00 00 00 00.
2. Запишем это же значение в текстовый файл - всего один байт: 30


Другое дело ,что в бинарном файле могут содержаться и текстовые значение. Этот текст может оказаться в любой кодировке.
0
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 20
10.04.2015, 07:06 11
Здравствуйте,
сейчас разбираюсь в бинарных файлах,приведен такой пример решения задачи, программа работает правильно, но не было комментариев и подробного листинга :

Создать файл вещественных чисел, записать в него матрицу вещественных чисел А размерности n * n . Не считывая матрицу в память, реорганизовать файл путем замены элементов побочной диагонали на элементы последнего столбца матрицы. Вывести на печать исходную и полученную матрицы. Печать матриц оформить в виде функции

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
void matrica (char*n,int x){
    FILE *f=fopen (n,"rb");
    float t;
    fseek(f,0,SEEK_SET);
    if(f!=NULL){
    for (int j=0;j<x;j++)
    {
        for(int i=0;i<x;i++)
        {
            fread(&t,1,sizeof(float),f);
            printf("%f ",t);
        }
        printf("\n");
    }}
    if(f!=NULL)fclose(f);
}
 
int main(int argc, char** argv) {
    int n; 
    float t,h;
    system("chcp 1251");
    system("cls");
    system("color F0");
    printf ("Введите размерность матрицы ");
    scanf("%d",&n);
    srand(time(NULL));
    char *name="matrix.txt";
    FILE *f;
    f=fopen(name,"wb");
    for(int j=0;j<n;j++)
    {
        for(int i=0;i<n;i++)
        {
            t=rand()%100+((float)(rand())/10000);
            fwrite(&t,1,sizeof(float),f);
        }
    }
    fclose(f);
    matrica(name,n);
    f=fopen(name,"r+");
    printf("\n");
    for(int i=1;i<n;i++)
    {
        fseek(f,i*n*(sizeof(float))+(sizeof(float))*(n-1),SEEK_SET);
        fread(&t,1,sizeof(float),f);
        fseek(f,sizeof(float)*n*i+sizeof(float)*(n-1-i),SEEK_SET);
        fread(&h,1,sizeof(float),f);
        fseek(f,sizeof(float)*n*i+sizeof(float)*(n-1-i),SEEK_SET);
        fwrite(&t,1,sizeof(float),f);
        fseek(f,sizeof(float)*n*i+sizeof(float)*(n-1),SEEK_SET);
        fwrite(&h,1,sizeof(float),f);
    }
    fclose(f);
    matrica(name,n);
    return 0;
}

не могу разобраться как работает программа, открыли файл, создали матрицу, а каким образом происходит реорганизация матрицы путем замены элементов побочной диагонали на элементы последнего столбца матрицы? как алгоритм работает?
Заранее спасибо за помощь
0
10.04.2015, 07:06
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2015, 07:06
Помогаю со студенческими работами здесь

Бинарные файлы
Добрый день. Написал программу со списками, но чтение из бинарного файла не работает, при чтении 1...

С++ бинарные файлы
Вот мой чудо-код, но он походу только *.txt файлы открывает, а мне нужно что бы и бинарные тоже....

Бинарные файлы в С++
У меня есть програмка которая находит наименьший общий делитель числа#include&lt;iostream&gt; using...

Бинарные файлы
Помогите пожалуйста написать программы. Исходный файл формировать программно. Количество...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как выполнить другую программу или системную команду из Python
InfoMaster 20.01.2025
Python предоставляет мощные инструменты для выполнения системных команд и управления внешними процессами, что делает его идеальным выбором для автоматизации различных задач системного. . .
Как узнать директорию bash-скрипта из самого bash-скрипта
InfoMaster 20.01.2025
При разработке bash-скриптов одной из важных задач является определение директории, в которой находится исполняемый скрипт. Это критически важно для корректной работы с файлами, загрузки конфигураций. . .
В чем разница между let и var в JavaScript
InfoMaster 20.01.2025
JavaScript прошел длинный путь эволюции с момента своего создания в 1995 году. Одним из важнейших аспектов развития языка стало совершенствование механизмов объявления и управления переменными. . . .
Эффективная работа со строками в Go
InfoMaster 20.01.2025
Язык программирования Go предлагает уникальный подход к работе со строками, который существенно отличается от многих других языков программирования. В Go строки представляют собой неизменяемые. . .
Как проверить, что отображение (map) содержит ключ в Go
InfoMaster 20.01.2025
Отображения (maps) в языке программирования Go представляют собой мощные структуры данных, которые позволяют хранить пары ключ-значение и обеспечивают быстрый доступ к данным по уникальным. . .
Как организовать домашнее хранилище фильмов с общим доступом для всей семьи
InfoMaster 20.01.2025
Преимущества домашнего медиасервера В современном мире, где цифровой контент стал неотъемлемой частью нашей жизни, организация домашнего медиасервера становится все более актуальной задачей. . . .
Перспективы развития жестких дисков: есть ли у них будущее?
InfoMaster 20.01.2025
История и эволюция жестких дисков История развития жестких дисков начинается в 1956 году, когда компания IBM представила первое устройство для хранения данных на магнитных пластинах - IBM 350. . .
Распознавание изображений (компьютерное зрение) на C++
InfoMaster 20.01.2025
Введение в компьютерное зрение и основы работы с изображениями Компьютерное зрение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, позволяющую. . .
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru