Другие языки программирования и технологии

С++ file со struct

Массивы индексируются с нуля, а не с единицы
int x[4]; // соответственно x[ 0 ], x[ 1 ], x[ 2 ], x[ 3 ];
for (int i = 0; i < 4; i++)
x[ i ];

Вся соль заключается в том y[ 4 ] - Это уже за пределами массива, и там может быть что угодно.
Дима Денисенко
Дима Денисенко
21 360
Лучший ответ
вопрос отличный +5
на ответы подпишусь, потому что самому очень интересно.
в с++ разбираюсь а вот эта тема file в struct всегда волновала

еще раз спасибо за вопрос
файл, содержащий данные типа структура? или структура, одним из полей которой является указатель на файл? в любом случае ничего сложного не вижу...
Начнем с того что структура написана не совсем верно.
Целесообразнее было бы создать структуру Point, которая хранила бы координаты одной точки, а потом создать структуру Rect, которая бы хранила две точки - верхнюю -левую и правую-нижнюю. Но даже если не использовать структуру Point, то все равно НЕ ПРАВИЛЬНО. Структура должна хранить просто четыре координаты, а не масив координат. Вот так:
struct RECT
{
double x1,y1; // координаты верхней-левой точки
double x2,y2; // координаты верхней-правой точки
};

теперь в функции main необходимо организовать массив из объектов структуры типа RECT. Вот так:

int main()
{
const kol = 4;
RECT rects[ kol ];

return 0;
}

теперь по поводу обращения к элементам массива: HANDLE прав! индексация элементов массива в С/С++ и родственных языках всегда начинается с нуля, в отличие от некоторых других языков.
Ну а дополнительный вывод последней строки связан с функцией feof. Лучше использовать немного другую конструкцию. Полный код привожу ниже. Да кстати, я не использую преобразования в стили С++, для данной задачи это вовсе не обязательно, но если надо произвести впечатления на преподавателя, то тогда конечно 

#include < iostream >
#include < fstream >
#include < ctime >
using namespace std;
struct RECT
{
double x1,y1;
double x2,y2;
};
int main()
{
const int kol = 4;
RECT rects[kol];
//заполняем координаты
srand(time(0));
for(int i=0; i < 4;i++)
{
rects.x1 = rand() % 101 - 50;
rects.y1 = rand() % 101 - 50;
rects.x2 = rand() % 101 - 50;
rects.y2 = rand() % 101 - 50;
//выведем на экран для проверки
cout<<rects.x1<<';'<<rects.y1<<'\t'<<rects.x2<<';'<<rects.y2<<endl;
}
cout<<endl<<endl;
//записали в файл
ofstream fout("rects.dat", ios::out|ios::binary);
if( fout . is_open ( ) )
{
fout.write((char*)rects, sizeof(rects));
}
else
{
cerr<<"Cannot open file for write!\n";
return 0;
}
fout.close();

//теперь читаем из файла данные
RECT tmp;//это вспомогательный объект структуры
ifstream fin("rects.dat", ios::in|ios::binary);
if( fin . is_open ( ) )
{
while(fin.read((char*)&tmp,sizeof(tmp)))
{
cout<<"top coord: ("<<tmp.x1<<';'<<tmp.y1<<")\t";
cout<<"bottom coord: ("<<tmp.x2<<';'<<tmp.y2<<")\n";
}
}
else
{
cerr<<"Cannot open file for reed!\n";
return 0;
}
fin.close();

return 0;
}