Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

fopen/fclose и класс fstream

1.9K
11 августа 2008 года
0xf001
96 / / 24.05.2005
Записываю данные в файл с помощью класса fstream. Записываю переменные через fstream.write() порциями, по порядку, а в другой программу в таком же порядке их извлекаю. Но по некоторым причинам сейчас мне нужно читать эти файлы с помощью функций fopen/fclose. Метод чтения один и тот же - хлопаю весь файл в оперативку, а затем раздракониваю его по программе. Вот тут кроется главная загвоздка - программа начинает читать всякую лабуду, причем не сразу.
Я пробовал провести эксперимент - записывать тоже с помощью fopen/fclose и получил интерестный результат - файл стал примерно на 100 кб больше, при том, что входные данные и порядок записи остались прежними.

Вопрос - существуют ли какие-то особые фичи при записи через fstream в отличии от стандартных функций?
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
Выложите код.
Такое подозрение, что при использовании fstream пишется в binary mode, а при fopen - в text mode
1.9K
11 августа 2008 года
0xf001
96 / / 24.05.2005
Нет, как раз открывается у меня везде в бинарном :)
Вот файл, если поможет. Просто, я думал там какие-то стандартные фичи есть, кроде приведения элементов структур к блокам по 4 байта, и в таком случае придется настраивать что-нибудь типа #pragma pack()
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
0xf001, ошибка скорее всего в вашем алгоритме чтения/записи.
У меня была подобная проблема пару лет назад, когда я писал для одного предприятия базу данных со сложной иерархической структурой.
Ошибка проявлялась при определенном наборе данных и зачастую портила всю базу
Провел эксперемент.
Код:
#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;
}
создает два идентичных файла и считывает данные без проблем
Т.е. дополнительные параметры при открытии файлов не требуются
З.Ы.: Компилятор GCC 4.2.1
1.9K
12 августа 2008 года
0xf001
96 / / 24.05.2005
В общем, не знаю где я ошибся. Я заново аккуратно переписал проект под fopen/fclose и вроде работает... КолдОвство какое-то..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог