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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ неопределенный символ в строке http://www.cyberforum.ru/cpp-beginners/thread287598.html
Почему ругается на w как на неопределенный символ в строке angel N1(149, 34.8, w); #include <iostream.h> /////////////////////////////////////////////////////////// class angel { private: int gradys; float minutes; char napravlenie;
C++ Неявное подключение DLL (Visual C++) Здравствуйте. Нужна Ваша помощь. Как правильно выполнить неявное подключение библиотеки к программе? Я это делаю таким способом: // dll.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include "windows.h" http://www.cyberforum.ru/cpp-beginners/thread287582.html
Упорядоченная строка C++
Может кто-нибудь подсказать, как этот кусок кода реализовать? Найти в массиве первую строку, все элементы которой упорядочены по убыванию. Изменить упорядоченность элементов этой строки на обратную. (Массив двумерный)
Динамическая матрица C++
помогите плз не могу разобраться уже неделю( вот само задание Найти произведение двух симметрических относительно побочной диагонали квадратных матриц. Для каждой симметрической матрицы в памя-ти создать её верхний или нижний относительно побочной диагонали треугольник. мой код приближён к решению способен вывести симетричную марицу используя 1 треугольник а умножить никак вот мой код...
C++ Как писать под RockBox? http://www.cyberforum.ru/cpp-beginners/thread287558.html
Всем здравствуйте! :) У меня возникла такая проблема: нужно написать какую-нибудь игру ил программу для плеера, работающего на RockBox. Написать её нужно на Си. Но я с этим никогда не сталкивался и как следствие у меня такая просьба. У кого есть какая-нибудь инфа по этому поводу, а ещё лучше исходники хотя бы небольших, простеньких программ, скиньте пожалуйста ссылки. Интересна любая инфа...
C++ Эквивалентны ли char * и char po[40] В книге Прата имеется такой текст: Stack<char *> st; // создает стек для указателей на сhаг Затем в первой версии string po; // Объявление Stack<string> st заменяется на char * po; Идея состоит в том, чтобы для реализации ввода с клавиатуры использовать указатель char вместо объекта string. Но этот подход изначально можно назвать неудачным, поскольку при создании указателя не создается... подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
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!

Между прочим, эта же функция сравнения прекрасно работает с любыми текстовыми файлами, поскольку ввод информации осуществляется посимвольно.
 
Текущее время: 15:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru