Форум программистов, компьютерный форум CyberForum.ru

Запись/чтение нуля из бинарника - C++

Войти
Регистрация
Восстановить пароль
 
Guard
Сообщений: n/a
24.11.2009, 11:35     Запись/чтение нуля из бинарника #1
Здравствуйте!

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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;
        step=0;
        for (short ii=0; ii<nn_av; ii++)
        {
            int dt=nzap*Kadrf;
            int tt_t=0;
            fwrite(&tt,sizeof(tt),1,fa32);
            step+=dt;
// проверка
            fseek(fa32,-sizeof(tt),1);
            fread(&tt_t,sizeof(tt),1,fa32);
            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 все работает прекрасно и так, как нужно.
Буду очень признателен даже не за исправленный код, а за объяснение причины явления - исправлю сам, надеюсь

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2009, 11:35     Запись/чтение нуля из бинарника
Посмотрите здесь:

Чтение\запись файлов C++
C++ Чтение/запись
C++ Чтение бинарника по биту
C++ Считывание из бинарника
Чтение 16-и битных слов из бинарника (загрузка Wav) C++
C++ Чтение нескольких байт из бинарника
Чтение и запись C++
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++
Чтение бинарника fortran в C++ C++
C++ Восстановление списка из бинарника
Компиляция бинарника на gcc C++
Вычислить среднее арифметическое элементов, расположенных до первого нуля и после последнего нуля C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
24.11.2009, 16:35     Запись/чтение нуля из бинарника #2
Напиши отдельно тест только для этой переменной.
И вообще при fseek(), fwrite(), fread() нужно проверять как выполнился код.
Для fseek() в последнем аргументе лучше SEEK_SET, SEEK_CUR использовать, а не цифры.
Guard
Сообщений: n/a
26.11.2009, 11:06     Запись/чтение нуля из бинарника #3
К сожалению, ничего из вышеперечисленного не выявило ошибок. Тест отдельно для этой переменной, как я понял, нужен был для того, чтобы проверить, возвращает ли fseek() каретку если указано отрицательное количество байт. дело оказалось не в этом. дальше, смена цифр на дефолтные константы не привели к результату. также, при проверке fwrite() показывает, что записала успешно 1 объект....

М.б. есть какие-то идеи насчет субжа? куда копать?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
27.11.2009, 07:45     Запись/чтение нуля из бинарника #4
Можно перед записью и перед считыванием проверить положение курсора в файле, должны совподать.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.11.2009, 09:00     Запись/чтение нуля из бинарника #5
Код ужасен!
Эту же задачу можно решить, используя в пять(!) раз меньше кода.
Мешанина из Си, С++, VCL - не есть айс.
Yandex
Объявления
27.11.2009, 09:00     Запись/чтение нуля из бинарника
Ответ Создать тему
Опции темы

Текущее время: 15:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru