Работа с бинарными файлами
О том, что такое массив структур и как обмениваться данными между массивом и dataGridView
я рассказывал в предыдущей статье.
Здесь будет рассмотрен обмен данными dataGridView
с бинарным файлом через массив структур (для удобства).
1. Для начала, после строки namespace ... (в самом верху), объявим массив структур:
struct mas{
char *a, *d;
double c;
};
mas p[10];
2. Сохранение массива в бинарный файл. Для простоты действовать будем "старыми" методами, которыми мы пользовались в Си.
Необходимые библиотеки (обьявить в самом вверху после #pragma once
):
#include "string.h"
#include "stdio.h"
int a, d;
using namespace System::Runtime::InteropServices; //для Marshal
if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) //открытие saveFileDialog1
{
//заполнение массива структур
for (int i = 0; i < dataGridView1->RowCount-1; i++){
p[i].a = (char*)(void*)Marshal::StringToHGlobalAnsi(dataGridView1[0, i]->Value->ToString());
p[i].d = (char*)(void*)Marshal::StringToHGlobalAnsi(dataGridView1[1, i]->Value->ToString());
p[i].c = Convert::ToDouble(dataGridView1[2, i]->Value->ToString());
}
//открытие файла
char*str1 = (char*)(void*)Marshal::StringToHGlobalAnsi(saveFileDialog1->FileName);
FILE*f = fopen(str1,"wb");
//сохранение количества строк dataGridView1 в файл
int q = dataGridView1->RowCount-1;
fwrite(&q,sizeof(int),1,f);
for(int i=0;iRowCount-1;i++)
{
a=strlen(p[i].a)+1; //считаем длину строки в ячейке
d=strlen(p[i].d)+1;
fwrite(&a,sizeof(int),1,f); //сохраняем длину в файл
fwrite(&d,sizeof(int),1,f);
fwrite(p[i].a,a,1,f); //сохраняем содержимое в файл
fwrite(&p[i].c,sizeof(double),1,f);
fwrite(p[i].d,d,1,f);
}
fclose(f); //закрываем файл
}
3. Чтение информации из бинарного файла в массив структур, а потом в dataGridView
.
using namespace System::Runtime::InteropServices;
if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) //открытие openFileDialog1
{
//очистка dataGridView1
for(int i = 0; i < dataGridView1->RowCount-1; i++){
dataGridView1[0, i]->Value = "";
dataGridView1[1, i]->Value = "";
dataGridView1[2, i]->Value = "";
}
FILE* f;
int count;
//открытие файла
char* str1=(char*)(void*)Marshal::StringToHGlobalAnsi(openFileDialog1->FileName);
f=fopen(str1,"rb");
fread(&count,sizeof(int),1,f);
int i;
for(i=0;i<count;i++)
{
//выделение памяти
int mas1[2];
fread(mas1,sizeof(int),2,f);
p[i].a=new char[mas1[0]];
p[i].d=new char[mas1[1]];
//чтение из файла в массив
fread(p[i].a,mas1[0],1,f);
fread(&p[i].c,sizeof(double),1,f);
fread(p[i].d,mas1[1],1,f);
}
//чтение из массива в dataGridView1
for(int k=0;k<i;k++){
dataGridView1->Rows->Add();
dataGridView1[0,k]->Value = gcnew String(p[k].a);
dataGridView1[2,k]->Value = Convert::ToString(p[k].c);
dataGridView1[1,k]->Value = gcnew String(p[k].d);
}
fclose(f); //закрываем файл
}