Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2009, 10:28   #1
Jorgen
Новичок
Джуниор
 
Регистрация: 26.11.2009
Сообщений: 1
Печаль Запись/чтение из бинарного файла - непонятные проблемы....

Здравствуйте!

Такая проблема обозначилась:
есть некоторая переменная типа unsigned int tt, которая на каждом шаге цикла должна записываться в файл, предваряя собой выборку данных. При этом, первое значение перменной равно 0 (ибо время), записываю его(ноль) в файл, в следующих 2 строках делаю проверку (возврат на 4 байта, чтение в другую переменную) и получаю значение этой другой переменной не 0, а 12097456980-образную ерунду. На последующих шагах цикла все выполняется правильно... Я в ступоре

Код:
FILE* fa32=NULL,*fcomdat=NULL;
 
    float fdat[32], Kadrf=0;
    short nzap=0;
    unsigned short nn_av=0;
    short dat[150],kk;
    unsigned int tt=0; // определение переменной
    char drive[MAXDRIVE], dir[MAXDIR], file[MAXFILE];
    char ext[MAXEXT], buffer[200];
    char ctemp[1000];
    AnsiString Ext,temp,buff;
    fnsplit(Fil2.c_str(),drive,dir,file,ext);
    Ext=(AnsiString)ext;
    Ext=Ext.LowerCase();
    fa32=fopen(Fil2.c_str(),"r+b");
    temp=Fil1;
    temp.Delete(temp.LastDelimiter("."),temp.Length());
    temp+=".dat";
    fcomdat=fopen(temp.c_str(),"rt");
 
    if (Ext==".edm")
    {
        fseek(fa32,64,0);
        fseek(fa32,sizeof(int),1);
        fseek(fa32,sizeof(short),1);
        fseek(fa32,sizeof(struct date),1);
        fseek(fa32,-(long)(sizeof(struct date)),SEEK_CUR);
        fseek(fa32,sizeof(TDateTime),1);
        fseek(fa32,sizeof(short),1);
// чтение из COMTRADE результатов и запись в *.edm
        for (short ii=0; ii<nn; ii++)
        {
            fgets(ctemp,1000,fcomdat);
            ctemp[32*6+10*2+32*1+1]='\0';
            temp=(AnsiString)ctemp;
            kk=npar-1;
            for (short i=0;i<npar;i++, kk--)
            {
                buff=ReadLast(temp);
                dat[kk]=buff.ToInt();
            }
            buff=ReadLast(temp);
            buff=ReadLast(temp);
            tt=(buff.ToInt())*1000/dfr[0].ss;
            fwrite(&tt,sizeof(unsigned int),1,fa32);
            fseek(fa32,-sizeof(tt),1);
            fread(&tt,sizeof(tt),1,fa32);
            fwrite(&dat,npar*sizeof(short),1,fa32);
        }
    }
    

//Начало проблемного кода

    else if(Ext==".a32")
    {
        // вот это все читается нормально
        fread(&nn_av,sizeof(unsigned short),1,fa32);
        fseek(fa32,sizeof(short),1);
        fread(&nzap,sizeof(short),1,fa32);
        fseek(fa32,sizeof(short),1);
        fseek(fa32,sizeof(TDateTime),1);
        fread(&Kadrf,sizeof(float),1,fa32);
        nn=nn_av*nzap;
        
        tt=0;
        for (short ii=0; ii<nn_av; ii++)
        {
            int dt=nzap*Kadrf;
            int tt_t=0;

// вот до этого момента проблем с ним не возникает
            fwrite(&tt,sizeof(tt),1,fa32); // здесь идет запись нужной переменной
            tt+=dt;
// проверка записи
            fseek(fa32,-sizeof(tt),1);
            fread(&tt_t,sizeof(tt),1,fa32);

// и tt_t принимает значение на первом шаге не 0, а... 1257682476

            for (short cc=0; cc<nzap;cc++)
            {
                fgets(ctemp,1000,fcomdat);
                temp=(AnsiString)ctemp;
                kk=npar-1;
                for (short i=0;i<npar;i++, kk--)
                {
                    buff=ReadLast(temp);
                    dat[kk]=buff.ToInt();
                }
                fwrite(&dat,npar*sizeof(short),1,fa32);
            }
        }
    }
    fclose(fcomdat);
    fclose(fa32);
При этом, для файла с расширением *.edm все работает с точностью до наоборот - первое(нулевое значение) записывается и читается так, как нужно, а следующие уже имеют вид 557650098754.
Буду очень признателен за объяснение причины явления - исправлю сам, надеюсь...

Заранее спасибо!
Jorgen вне форума Ответить с цитированием
Старый 26.11.2009, 11:45   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Я, в таких случаях, сначала проверяю, а что я вообще в файл пишу. Делается это так, записываете значение в файл, закрываете поток. Открываете файл сторонней программой (шестнадцатеричным редактором), и сверяете с тем, что должно быть. Тогда сразу станет понятно в каком месте у вас ошибка.

Хотя я, кажется, понял в чем ваша ошибка.

Цитата:
Код:
fseek(fa32,-sizeof(tt),1);
fread(&tt_t,sizeof(tt),1,fa32);
Вы немного не правильно ставите указатель.
fseek имеет 3 аргумента -файл ваш (это правильно, наверное) смещение относительно источника (см. далее), и сам "источник" принимает всего 3 возможных значения:

SEEK-SET начало файла.

SEEK-CUR текущая позиция указателя на
файл.

SEEK-END конец файла.

т.е. в вашем случае правильно было бы писать

Код:
fseek(fa32,-sizeof(tt),SEEK-CUR);//смешаем на -1 размер этой переменной от текущей позиции (т.е. от туда. где был указатель после записи)
или
Код:
fseek(fa32,ii*sizeof(tt),SEEK-SET);//смещаем от начала на ii позиций
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 26.11.2009 в 12:03.
ROD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение\запись из файла Skrip Общие вопросы C/C++ 3 23.09.2009 19:05
Запись и чтение из файла МаксMorfey Общие вопросы по Java, Java SE, Kotlin 5 10.06.2009 11:39
Запись/чтение из файла (С++) alexov Общие вопросы C/C++ 15 18.01.2009 17:35
Запись и чтение файла... Altera Общие вопросы Delphi 5 06.05.2008 20:22