Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Чтение из двоичного файла
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Avalon_de_Loren Avalon_de_Loren вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.07.2003
По умолчанию Чтение из двоичного файла - 11.07.2003, 12:08

Допустим, структура (толко инициализированная):
Код:
struct scan_info{   //инфа о сканере
   char Model[25];  //модель
   int Price;            //цена
   double x_size;    //длина
   double y_size;    //ширина
   int Optl_res;       //оптическое разрешение
   int Grey_grad;    //градации серого
};
- записана в "Bin.txt" в двоичном режме.
Как в эту же структуру из этого файла в двоичном режиме считать инфу?
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 11.07.2003, 15:14

Код:
struct scan_info si;
FILE* fin = fopen("Bin.txt", "rb");
ASSERT(fin != NULL);
int nBytes = fread(&si, 1, sizeof(si), fin);
ASSERT(nBytes == sizeof(si));
fclose(fin);
Ответить с цитированием
  (#3 (permalink)) Старый
Avalon_de_Loren Avalon_de_Loren вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.07.2003
По умолчанию тогда в файл неправильно записано - 11.07.2003, 22:41

А это запись в файл:
Код:
   FILE *Sout = fopen("Bin.txt", "wb");
   fseek(Sout, SEEK_END, SEEK_SET);
   fwrite(Buf, sizeof(Buf), 1, Sout);
   fclose(Sout);
Выводит прога полную (хотя и упорядоченную) чушь, в том смысле, что где char* выводится строка, например, т.е. поля заполняются в соответствии с типом, но заполняются совсем не тем. Вывод: неправильно поставлена работа с потоками.(???)
Ответить с цитированием
  (#4 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию Re: тогда в файл неправильно записано - 14.07.2003, 09:35

1. Если ты хочешь дописывать информацию в конец файла, то правильный код такой:
Код:
fseek(Sout, 0L, SEEK_END);
2. Не забыл ли ты про выравнивание? Если пишет в файл одна программа, а читает - другая, это может оказаться причиной проблем.
Ответить с цитированием
  (#5 (permalink)) Старый
Avalon_de_Loren Avalon_de_Loren вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.07.2003
По умолчанию продолжение - 14.07.2003, 10:04

Ваш код работает не совсем так, как мне нужно: fwrite и fread - возвращают не кол-во записанных байт, а кол-во записей! Это раз!
Второе, и считывает, и записывает одна программа, но может быть, действительно, потому, что я не закрываю потоки до конца проги, она и глючит.
Мне не совсем понятно, как работает fread: при чтении в структуру заполняется только поле, например, char model... а далее все поля заполняются мусором.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 19.07.2003, 23:47

Очень хорошо, что ты заметил ошибку в моем коде. Поправил.
А вот еще один совет: попробуй использовать функцию fflush(), может, это поможет решить проблемы с "мусором". Если нет - посмотри дамп памяти в отладчике и попробуй выяснить, откуда берется "мусор".
Ответить с цитированием
  (#7 (permalink)) Старый
Avalon_de_Loren Avalon_de_Loren вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.07.2003
По умолчанию fileworks - 21.07.2003, 20:26

знацца, я тут посидел - и набросал кое-что:

Входной файл(открываемый в текстовом виде) Text.txt:
number_one 20
number_two 30

Код:
//...
struct example{
    char Name[20];
      int  Num;
   }examp[2];

   int n = 2;

   fflush(Read);

//считывание в структуру

   for(int i = 0; i < n; i++){
    char str[23];
    fread(&str[0], sizeof str, 1, Read);
      strncpy(examp[i].Name, str, 19);
      examp[i].Name[19] = '0';
  examp[i].Num = atoi(&str[20]);
      cout << examp[i].Name << " - " << examp[i].Num << endl;
    }

   fclose(Read);
//вывод структуры в двоичный файл
   if((Write = fopen("Bin.txt", "wb")) == 0)
    {cout << "Error: can't open output file"; return 1;}

   for(int j = 0; j < n; j++){
    void *P = &examp[j];
    fwrite(P, sizeof examp[0], 1, Write);
      fflush(Write);
   }
   fclose(Write);
//считывание из двоичного файла
   Read = fopen("Bin.txt", "rb");
    fflush(Read);
   fread(&examp[0], sizeof examp[0], 1, Read);
//...
самое интересное, что прога работает адекватно! Я дико удивился, когда она правильно считала из "двоичного" файла! Может помогла предложенная функция очистки потока, а может просто изначально нормально заполнились поля структуры. Вывод: получается, что когда я пытался заполнить поля через клаву, то неправильно сработал cin << examp[i].Name << examp[i].Num!(???)
причем с помощью fread'a я сначала считал (как изволите видеть) во временную строку, а потом разделил ее как надо.
Но мне надо уметь считывать из любого файла, не зная точной длины имен, например входной файл:
Имя_самое_первое 1
Имя_срединное 2
Имя 3
Как мне из такого образца заполнить поля приведенной выше структуры???????
Ответить с цитированием
  (#8 (permalink)) Старый
sTiNg sTiNg вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.02.2003
По умолчанию Re: Чтение из "двоичного" файла - 13.08.2003, 22:32

Цитата:
Originally posted by Avalon_de_Loren
[b]Допустим, структура (толко инициализированная):
Код:
struct scan_info{   //инфа о сканере
   char Model[25];  //модель
   int Price;            //цена
   double x_size;    //длина
   double y_size;    //ширина
   int Optl_res;       //оптическое разрешение
   int Grey_grad;    //градации серого
};
- записана в "Bin.txt" в двоичном режме.
Как в эту же структуру из этого файла в двоичном режиме считать инфу?
вообще текстовый легко считываются самым обычным fread()
а если тибе нада читать из, например, *.exe то тебе нада исользовать лучше всего либо операторы _asm либо, что тоже самое будет,
использовать функции dos.h _dos_read() _dos_write() - так как они генерируют прерывание дос 3dh(открытие файла) _dos_open()
а что бы считать позицию курсора то тоже асм - 42h функция.
то есть -
_asm ah,0x42;
_asm al,0x00;
_asm bx,Handler;
_asm cx,0;
_asm dx,0;
_asm int 21h;
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла levpost Visual Basic 0 29.09.2011 00:38
Построчное чтение из файла imported_Albert Вопросы начинающих программистов 2 21.01.2011 22:24
Чтение из файла С++ michahodrev Visual C++ 1 19.12.2010 13:28
Чтение и запись из файла annnytka .NET 4 17.12.2010 14:24
Чтение из файла frenku PHP 1 02.09.2010 18:43
Чтение из файла. djvu Prolog 1 05.11.2008 20:16
Чтение текстового файла IL_Agent Visual C++ 4 02.02.2007 21:00
Чтение данных из файла kzoi С/С++ 2 24.05.2006 12:14
Как из двоичного файла считать часть заданного размера vde C++ Builder 2 14.11.2005 17:01
чтение строки из файла imported_kep PHP 5 01.08.2005 02:50
Чтение файла из памяти в С++ dimax Visual C++ 1 07.05.2005 22:55
Как сделать чтение из файла imported_solaris С/С++ 24 29.12.2003 14:40



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов