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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2012, 12:51   #1
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию Странное поведение функций ввода бинарного файла

Пытаюсь заполнить структуру:
Код:
struct OvcHode
{
int node;     // Номер строки
unsigned int size_str; // Длина стоки strin
string strin;          // Строка
int a[4];     // Характеристики узла
int uroven;   // Уровень вложенности
};
из бинарного файла.
Код:
FILE *handle;
if((handle = fopen("~temp.nod","r")) != NULL)
{
do
{
    Node.node = _getw(handle);
    Node.size_str = _getw(handle);
//  fread(&Node.node,sizeof(int),1,handle);
//  fread(&Node.size_str,sizeof(int),1,handle);
//  fread(bufer, 1, Node.size_str,handle);
  for(i=0; i<Node.size_str; i++)
    x[i] = (unsigned char)fgetc(handle);
  x[i] = 0x0;
  Node.strin = static_cast<string>(x);
  s = static_cast<AnsiString>(x);
  Node.strin = s.c_str();
  for(int j = 0; j<4; j++)
  {
    fread(&Node.a[j],sizeof(int),1,handle);
    b = Node.a[j];
  }
  if(s == rrr)
          a = 0;
}while(feof(handle) == 0);
fclose(handle);
}
Всё идёт нормально до тех пор пока при вводе целого числа не встретится код 0x0D.
Цитата:
00 00 00 00
0D 00 00 00
D0
E5 E4 FC EA E0 20 F7 B8 F0 ED E0 FF
FF FF FF FF
02 00 00 00
00 00 00 00
00 00 00 00
По идее должны считываться первые четыре байта в первую переменную, четыре во вторую, затем 13-ть байт строка и 16 оставшихся байт в 4-е переменные.
Но происходит следующее.
В первую переменную нулевые байты считываются нормально.
При считывании второго числа, 0D пропускается и считывается число
00 00 00 D0 = 3489660928 dec.
Перебрал несколько функций _getw, read, fread, fgetc, fscanf, fgets FileRead. Везде одна и та-же хрень. Может кто сталкивался с подобным эффектом и как его обойти?

Обнаружил ещё одну странность.
Вставляю в код проверку
Код:
    t = ftell(handle);
    Node.node = _getw(handle);
    t = ftell(handle);
    Node.size_str = _getw(handle);
    t = ftell(handle);
Итерацию он делает правильную даже при чтении кода 0D.
474, 478, 482... но вот читает число со сдвигом на один байт
Если в коде встречается 0A, число считывается верно, а вот к итерации прибавляется единица.
472, 476, 481
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 21.01.2012 в 13:59.
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.01.2012, 13:55   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

0D - 13 код, он же enter, конец ввода. Управляющая Esc последовательность.

Может быть можно как то пофиксить факт "не_читаемого байта", путём контроля позиции каретки в файле при каждом последующем чтении? Если имело место смещение на 1 байт вправо, стало быть, был пропущен Enter, и считывать не 4 байта, а только 3. А первый байт ручками восстанавливать, зная что он должен быть OD ?

Я то сам приплюснутыми средствами пользуюсь. Почему то я ни разу ни на что подобное не напарывался...
_Bers вне форума Ответить с цитированием
Старый 21.01.2012, 13:56   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Что за смесь не понятная из С, С++, и билдера? Нахватали кусков из разных технологий и удивляетесь почему не работает.
Если хотите писать на C++ используйте потоки для ввода/вывода.
Если на C - уберите std::string.

Если из вашей структуры убрать член string strin, заменив его на char[], она станет POD-типом, и сможете записывать и читать ее одни куском.

Цитата:
Сообщение от _Bers Посмотреть сообщение
0D - 13 код, он же enter, конец ввода. Управляющая Esc последовательность.
В бинарном режиме не должны преобразовываться esc-последовательности. Просто ТС открыл файл не в бинарном режиме
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 21.01.2012 в 13:59.
Blade вне форума Ответить с цитированием
Старый 21.01.2012, 14:09   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
В бинарном режиме не должны преобразовываться esc-последовательности. Просто ТС открыл файл не в бинарном режиме
А.. и в правду) Я чет сразу то и не посмотрел
Ну так может в этом и заключается все дело?)
_Bers вне форума Ответить с цитированием
Старый 21.01.2012, 14:10   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Если из вашей структуры убрать член string strin, заменив его на char[], она станет POD-типом, и сможете записывать и читать ее одни куском.
С вводом строк, как раз-таки проблем нет.
Эта странная смесь, результат мозголомства. Никогда не приходилось работать с чисто бинарными файлами.
Пишу в Билдере на C++. std::string у меня явно не объявлен.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.01.2012, 14:18   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Открывайте файл в бинарном режиме
Код:
if((handle = fopen("~temp.nod","rb")) != NULL)
и попробуйте.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 21.01.2012, 14:22   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Спасибо Blade. Надо-же. На такой фигне поймался . Плюсик Вам в репку!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное поведение процедуры Sergey1974 Общие вопросы Delphi 2 11.12.2009 21:41
Странное поведение базы yulia БД в Delphi 7 22.04.2009 07:15
Странное поведение ПОИСКПОЗ ZORRO2005 Microsoft Office Excel 5 19.05.2008 14:02