#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
int main() {
// записываем два файла разными методами
ofstream of("f1.dat",ios::binary);
ifstream in;
FILE* f=fopen("f2.dat","wb");
int i;
double d=200.0,j,k;
for (i=1;i<=1024;i++) {
of.write((char*)&d,sizeof(double));
fwrite(&d,sizeof(double),1,f);
d+=d/i;
}
fclose(f);
of.close();
// Считываем, поменяв методы местами
in.open("f2.dat",ios::binary);
f=fopen("f1.dat","rb");
for (i=1;i<=1024;i++) {
in.read((char*)&j,sizeof(double));
fread(&k,sizeof(double),1,f);
cout<<i<<' '<<j<<' '<<k<<endl;
}
fclose(f);
in.close();
return 0;
}
fopen/fclose и класс fstream
Я пробовал провести эксперимент - записывать тоже с помощью fopen/fclose и получил интерестный результат - файл стал примерно на 100 кб больше, при том, что входные данные и порядок записи остались прежними.
Вопрос - существуют ли какие-то особые фичи при записи через fstream в отличии от стандартных функций?
Такое подозрение, что при использовании fstream пишется в binary mode, а при fopen - в text mode
Вот файл, если поможет. Просто, я думал там какие-то стандартные фичи есть, кроде приведения элементов структур к блокам по 4 байта, и в таком случае придется настраивать что-нибудь типа #pragma pack()
У меня была подобная проблема пару лет назад, когда я писал для одного предприятия базу данных со сложной иерархической структурой.
Ошибка проявлялась при определенном наборе данных и зачастую портила всю базу
Провел эксперемент.
Код:
Т.е. дополнительные параметры при открытии файлов не требуются
З.Ы.: Компилятор GCC 4.2.1
В общем, не знаю где я ошибся. Я заново аккуратно переписал проект под fopen/fclose и вроде работает... КолдОвство какое-то..