Работа с бинарными файлами
×

Работа с бинарными файлами

О том, что такое массив структур и как обмениваться данными между массивом и 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);        //закрываем файл
	
}