Почему он читает файл правильно только во второй раз - PullRequest
1 голос
/ 28 апреля 2011

У меня есть файл, первые 64 байта которого:

0x00:  01 00 00 10 00 00 00 20 00 00 FF 03 00 00 00 10  
0x10:  00 00 00 10 00 00 FF 03 00 00 00 10 00 00 FF 03  
0x20:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
0x30:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Когда я читаю файл (режим чтения и записи) в позиции 26 для 4 байтов, я получаю 0, а в следующий раз (в позиции 30) я получаю правильно 4096.

Код:

// read LastDirectoryBlockStartByte...
seekg(26);
char * pCUIBuffer = new char[4];
read(pCUIBuffer, 4);
const unsigned int x1 = gcount ();
const unsigned int LastDirectoryBlockStartByte = *(unsigned int *)pCUIBuffer;

// read LastDirectoryBlockNumberItems...
seekg(30);
read(pCUIBuffer, 4);
const unsigned int x2 = gcount ();
const unsigned int LastDirectoryBlockNumberItems = *(unsigned int *)pCUIBuffer;

С помощью gcount () я проверил, что байты прочитаны - и это было правильно оба раза 4. Я понятия не имею, чтобы отладить его.

---------- РЕДАКТИРОВАТЬ ----------

Когда я использую следующий код (с некоторыми заглушками перед ним), он читается правильно:

char * pCUIBuffer = new char[4];
seekg(26);
read(pCUIBuffer, 4);
const unsigned int x1 = gcount ();
seekg(26);
read(pCUIBuffer, 4);
const unsigned int x2 = gcount ();
const unsigned int LastDirectoryBlockStartByte = *(unsigned int *)pCUIBuffer;

// read LastDirectoryBlockNumberItems...
seekg(30);
read(pCUIBuffer, 4);
const unsigned int x3 = gcount ();
const unsigned int LastDirectoryBlockNumberItems = *(unsigned int *)pCUIBuffer;

Сложность состоит в том, что код стоит в начале метода. И «ложное прочитанное значение», очевидно, не имеет ничего общего с перечисленным кодом. Может быть, есть трюк со сбросом или синхронизацией (но оба я пытался ...) или что-то еще ...

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Вы говорите, что pCUIBuffer содержит указатель:

*(unsigned int *)pCUIBuffer;

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

0 голосов
/ 23 мая 2011

Сейчас я пишу ответ, потому что моя попытка связаться с TonyK не удалась (я попросил написать ответ).

Идеальный ответ на мой вопрос состоял в том, чтобы разрешить исключения, позвонив по номеру exceptions (eofbit | failbit | badbit).

Rumo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...