Member 12330615 Ответов: 1

Создание файла в ПК, но сломанные записи


Привет,
Я хочу сделать потоковый файл на ПК с помощью VC++.

Расположение записей выглядит следующим образом:
struct Log_record {

char sequence[8];

int   index;

int   cord;

char  crlf[2];

}

Log_record my_rec;

char LogBuffer[sizeof(my_rec)*1000];

for (int i = 0;i<1000;i++)

{

  CString s = _T("");

  s.Format(_T("%07d"), i+1);

  Widechartomultibyte(s,...., my_rec.sequence, 8, NULL,NULL);

 my_rec.index = 0;;

 my_rec.cord = 0;

 my_rec.crlf = 0x0d0a;

 memcpy(&LogBuffer[i*sizeof(my_rec), &my_rec, sizeof(my_rec));

}


Итак, после заполнения Логбуфера 1000 записями и fwrite с опцией "ab" один раз.
Поэтому я ожидаю, что файл со структурой будет выглядеть следующим образом
0000001 ..... CRLF 

0000002 ..... CRLF

.....

....

0001000 ...... CRLF




Но иногда,
Это делает файл с последовательностью пробелов или без CRLF.
Это похоже на сломанные пластинки...

В чем причина этой проблемы?

1. простая ошибка кодирования?
2. или любая другая причина ПК?

Пожалуйста, помогите мне.

Заранее спасибо

Что я уже пробовал:

Еще 1 неделя потрачена впустую на эту проблему.

Richard MacCutchan

Почему бы просто не заполнить вашу структуру и не записать каждую запись по одной, а не копировать в буфер журнала? Таким образом, вы можете использовать свой отладчик и точно проверить, что происходит. Кроме того, зачем вам нужна последовательность CRLF для записей фиксированной длины в двоичном файле?

Member 12330615

Для этого требуется последовательное количество записей. Поэтому я использую Logbuffer наполнен 1000 последовательных записей....
CRLF нужны для того, чтобы я видел файл своими глазами...

Richard MacCutchan

Ни то, ни другое не является веской причиной для того, что вы делаете. И вы все еще не показали весь код, так что невозможно догадаться, что вы делаете не так.

Espen Harlinn

Вы не забыли вызвать fclose на ручке перед выходом из программы?
Вы также можете отбросить CString и вызвать sprintf непосредственно в вашем буфере (my_rec. sequence) - тогда вызов Widechartomultibyte не потребуется, так как sprintf работает с char, а не с wchar_t ...

Member 12330615

Этот файл является индексным файлом, так как последовательности очень важны. Так, Logbuffer с 1000 последовательных записей. Но в нескольких транзакциях индексы разбиты (?) и заполнены пробелами, и нет CRLF, когда я вижу файл с помощью "блокнота".

1 Ответов

Рейтинг:
8

Espen Harlinn

Попробуйте что-нибудь вроде этого:

#pragma pack(push)
#pragma pack(1)
struct LogRecord
{
    char sequence[8];
    int   index;
    int   cord;
    char  crlf[2];

    LogRecord()
        : sequence{ }, index{ }, cord{ }, crlf{'\r','\n' }
    { }

};
#pragma pack(pop)


int main()
{
    auto handle = fopen( "F:\\src\\SimpleLogger\\log.dat", "ab" );

    LogRecord records[1000];

    for ( int i = 0; i < 1000; i++ )
    {
        sprintf( records[i].sequence, "%07d", i );
    }


    fwrite( records, 1, sizeof( records ), handle );

    fclose( handle );


    return 0;
}

С уважением
Эспен Харлинн