Как открыть и записать из бинарного файла массив?
вот я имею задание: Для двух файлов А та В, которые включают в себя по 17 элементов: A = {ai}, B = {bi}, i =1,17 необходимо выполнить следующие действия с элементами аi и bi : сi= (ai/bi)- и записать полученные значения ci в файл c = {ci}.
Я написал код для текстового файла, но не знаю как писать для бинарного, есть ли большие различия при записи и чтении бинарного файла и можно ли обойтись без массива и записать последовательность чисел в файл без него?
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<ctime>
#include<fstream>
#include<Windows.h>
using namespace std;
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int a[17] = {};
int b[17] = {};
int c[17] = {};
fstream f;
fstream f2;
fstream f3;
f.open("LR3(1).txt", fstream::in | fstream::out);
f2.open("LR3(2).txt", fstream::in | fstream::out);
f3.open("LR3(3).txt", fstream::in | fstream::out);
if (!f) {
cout << "Ошибка открытия файла";
exit(1);
}
else {
cout << "Файл 1 открыт\n";
}
if (!f2) {
cout << "Ошибка открытия файла";
exit(1);
}
else {
cout << "Файл 2 открыт\n";
}
if (!f3) {
cout << "Ошибка открытия файла";
exit(1);
}
else {
cout << "Файл 3 открыт\n";
}
for (int i = 0; i < 17; i++) {
a[i] = rand() % 100 + 1;
f << a[i] << " ";
b[i] = rand() % 10 + 1;
f2 << b[i] << " ";
c[i] = (a[i] / b[i]) - 2;
f3 << c[i] << " ";
}
f << endl;
f2 << endl;
f3 << endl;
cout << "Массив в 1 файле:\n";
for (int i = 0; i < 17; i++) {
f >> a[i];
cout << a[i] << " ";
}
cout << endl;
cout << "Массив в 2 файле:\n";
for (int i = 0; i < 17; i++) {
f2 >> b[i];
cout << b[i] << " ";
}
cout << endl;
cout << "Массив в 3 файле:\n";
for (int i = 0; i < 17; i++) {
f3 >> c[i];
cout << c[i] << " ";
}
cout << endl;
f.close();
f2.close();
f3.close();
return 0;
}
Ответы (1 шт):
Для работы с бинарными файлами, нужно сначала установить режим binary у потоков fstream
fstream f;
fstream f2;
fstream f3;
f.open("LR3(1).bin", fstream::in | fstream::out | fstream::binary);
f2.open("LR3(2).bin", fstream::in | fstream::out | fstream::binary);
f3.open("LR3(3).bin", fstream::in | fstream::out | fstream::binary);
А далее пример вашего кода без использования массива, с комментариями:
//Генерируем переменной случайное значение
//после чего записываем его в бинарный файл
int a, b, c;
for (int i = 0; i < 17; i++) {
a = rand() % 100 + 1;
//Конвертируем переменную в массив байтов грубо говоря
//и записываем sizeof(int) байт в файл
f.write((char*)&a, sizeof(int));
b = rand() % 100 + 1;
f2.write((char*)&b, sizeof(int));
c = (a / b) - 2;
f3.write((char*)&c, sizeof(int));
}
//Устанавливаем указатели get в файлах на начало файлов
f.seekg(0);
f2.seekg(0);
f3.seekg(0);
//Считываем по тому же принципе, как и записываем
cout << "Массив в 1 файле:\n";
for (int i = 0; i < 17; i++) {
f.read((char*)&a, sizeof(int));
cout << a << " ";
}
cout << endl;
cout << "Массив в 2 файле:\n";
for (int i = 0; i < 17; i++) {
f2.read((char*)&b, sizeof(int));
cout << b << " ";
}
cout << endl;
cout << "Массив в 3 файле:\n";
for (int i = 0; i < 17; i++) {
f3.read((char*)&c, sizeof(int));
cout << c << " ";
}
cout << endl;
f.close();
f2.close();
f3.close();
Как вы видите, для работы с бинарными файлами используются две функции write и read, которые принимают первым параметром буффер откуда будет браться информация или куда будут она будет записываться, а вторым параметром функции принимаю размер считываемой или записываемой информации.
Так же есть функции seekg и seekp они перемещают указатели get pointer или put pointer на число байт offset от установленного origin. В вашем случае используется seekg чтобы установить указатель для чтения, на начало файла.
Поподробней про работу с бинарными файлами можете почитать тут, поподробней об seekp и seekg тут