Форум программистов, компьютерный форум CyberForum.ru

Бинарные файлы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 247, средняя оценка - 4.88
RAEman
 Аватар для RAEman
0 / 0 / 0
Регистрация: 01.03.2011
Сообщений: 32
03.05.2011, 08:37     Бинарные файлы #1
Прошу помочь с новыми задачками
Миниатюры
Бинарные файлы  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2011, 08:37     Бинарные файлы
Посмотрите здесь:

Бинарные файлы.. C++
C++ С++ бинарные файлы
Бинарные файлы C++
Бинарные файлы c++ C++
Бинарные файлы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Exeil
 Аватар для Exeil
5 / 5 / 1
Регистрация: 06.12.2010
Сообщений: 50
03.05.2011, 09:18     Бинарные файлы #2
Если у тебя есть конкретный вопрос можешь спрашивать, если ты просишь решить за тебя то сомневаюсь что кто нибудь станет за тебя это делать
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
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!

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

Не по теме:

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

IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
03.05.2011, 14:18     Бинарные файлы #5
RAEman, отлично описал работу с двоичными файлами мистер Либерти. 536 страница книги С++ за 21 день.
smallvill
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
01.08.2011, 12:21     Бинарные файлы #6
А может кто то скажет какие символы используются для хранения например исполняемых файлов (весь Unicode или ASCII или д.) ???
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
01.08.2011, 12:29     Бинарные файлы #7
Вся информация в компьютере хранится в цифровом виде, конкретно в двоичном.
smallvill
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
02.08.2011, 00:02     Бинарные файлы #8
Я имел ввиду когда открываешь какой то .ехе файл с помощью текстового редактора там видно символы. Кодировка этих смволов??7
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
02.08.2011, 00:08     Бинарные файлы #9
такая, какая выставлена в твоем редакторе.
voral
346 / 326 / 46
Регистрация: 16.03.2008
Сообщений: 1,698
02.08.2011, 00:58     Бинарные файлы #10
Цитата Сообщение от smallvill Посмотреть сообщение
Я имел ввиду когда открываешь какой то .ехе файл с помощью текстового редактора там видно символы. Кодировка этих смволов??7
Та "кодировка" о которой вы говорите имеет смысл только в отношении текста. Утрировано говоря это таблица преобразования из кодов в "представление" той или иной буквы/символа.. В текстовом файле хранятся коды символов, эти коды используются как индексы втаблице преобразования. И пеуже при выводе на консоль компьютер знает как рисовать тот или иной символ. Если у компьтера в распоряжении окажется другая "таблица" символов. То вы на экране увидите абракатабру. Соответственно говорить о "кодировке" бинарного файла нет ни какого смысла. Для примера:
1 бинарный файл. Сохраняем значение переменной типа int. (Пусть она будет равна 0). В файле будет записано четыре (с оговоркой на архитектуру) байта: 00 00 00 00.
2. Запишем это же значение в текстовый файл - всего один байт: 30


Другое дело ,что в бинарном файле могут содержаться и текстовые значение. Этот текст может оказаться в любой кодировке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2015, 07:06     Бинарные файлы
Еще ссылки по теме:

C++ Бинарные файлы в С++
C++ Бинарные файлы
C++ Бинарные файлы

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

Или воспользуйтесь поиском по форуму:
djoker001
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 4
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;
}

не могу разобраться как работает программа, открыли файл, создали матрицу, а каким образом происходит реорганизация матрицы путем замены элементов побочной диагонали на элементы последнего столбца матрицы? как алгоритм работает?
Заранее спасибо за помощь
Yandex
Объявления
10.04.2015, 07:06     Бинарные файлы
Ответ Создать тему
Опции темы

Текущее время: 11:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru