Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/418: Рейтинг темы: голосов - 418, средняя оценка - 4.59
 Аватар для RAEman
0 / 0 / 0
Регистрация: 01.03.2011
Сообщений: 32

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

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

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

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

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

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

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

Решение

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

Обычно различают текстовые и двоичные файлы. Текстовые файлы состоят из строк, которые завершаются символом конца строки. В программе на С++ этот символ обозначается как '\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
03.05.2011, 13:09

Не по теме:

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

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


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

Создать файл вещественных чисел, записать в него матрицу вещественных чисел А размерности 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2015, 07:06
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru