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

Считывание из бинарника - C++

Восстановить пароль Регистрация
 
Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
23.07.2011, 00:32     Считывание из бинарника #1
C++
1
2
3
4
5
6
7
8
9
        FILE* fl=fopen((ExtractFilePath(ParamStr(0))+r_buf[0]+".bin").c_str(), "w");
 
        char* l=r_buf[1].c_str();
        WORD l1=strlen(l);
        fwrite(&l1,2,1,fl);
        for (int i=0; i<strlen(l); i++)
          fwrite(&l[i],1,1,fl);   
               
        fclose(fl);
тут проблем нет.

при считывании первое число в 2 байта считывается нормально, а текст обращается в число и программа вылетает с ошибкой, ссылаясь на строку fclose(fl); .
что не так? туплю
C++
1
2
3
4
5
6
7
        FILE* fl=fopen((ExtractFilePath(ParamStr(0))+r_buf[0]+".bin").c_str(), "r");
        WORD l; WORD a;
        fread(&l,2,1,fl);
        cout << l << endl;
        fread(&a,(int)l,1,fl);
        cout << a << endl;
        fclose(fl);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
23.07.2011, 00:43     Считывание из бинарника #2
Цитата Сообщение от Lifebinder Посмотреть сообщение
а текст обращается в число
Так где же текст, если
C
1
WORD a;
Это же целочисленная переменная.
C
1
fread(&a,(int)l,1,fl);
В одну переменную считывается сразу l байт, где l больше размера переменной. Переменная a должна быть символьным массивом?
И букву l в названиях переменных никто не использует.
Lifebinder
 Аватар для Lifebinder
6 / 6 / 0
Регистрация: 04.10.2009
Сообщений: 96
23.07.2011, 00:51  [ТС]     Считывание из бинарника #3
Опять я,дурак, с этим своим любимым WORD напутал все.
Заменил
C++
1
WORD a
на
C++
1
char a[40];
Удалите тему
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
23.07.2011, 01:07     Считывание из бинарника #4
Lifebinder, вот посмотри прмер написал как работать с бинарными файлами.
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
#include <windows.h>
#include <stdio.h>
#include <string.h>
 
 
 
int main(void) {
 
    char str[]  = "tasklist /m";
 
    FILE*  fp   = fopen("data.bin", "wb");
 
    WORD len  = (WORD) strlen(str);
    fwrite(&len, sizeof(WORD), 1U, fp);  // записать размер строки
 
 /*
    for(const char* iter = str; *iter; *iter++)    // запись по-байтно долго
        fwrite( &(*iter), 1U, 1U, fp);
 */
 
    fwrite(str, len, 1U, fp);    // запись всем блоком-строки быстро
 
    fflush(fp);   // сбрасываем буфер на диск
    fclose(fp);
 
 
 
    len = 0;
    fp  = fopen("data.bin", "rb");
    fread(&len, sizeof(WORD), 1U, fp);   // читаем размер строки
 
  /*  char ch;
    while(fread(&ch, 1U, 1U, fp)) { // дальше можно по-байтно долго,ведь у нас есть размер строки 
         fputc(ch, stdout);
    } */
 
    char* istr = new char[ len ];   // выделяем память с размером строки
    fread(istr, len, 1u, fp);          // читаем её
    fclose(fp);
 
    puts(istr);   // выводим в консоль
 
 
    delete[] istr;   // по-завершению удалим
    istr = NULL;
 
    getchar();
    return 0;
}
grizlik78
23.07.2011, 01:07
  #5

Не по теме:

Цитата Сообщение от Lifebinder Посмотреть сообщение
Удалите тему
И форум. Форум тоже удалите!
Шутка.

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.07.2011, 02:32     Считывание из бинарника #6
Цитата Сообщение от xAtom Посмотреть сообщение
прмер написал как работать с бинарными файлами.
1. Учитывая, что размер файла на диске всё равно будет, как минимум, равен блоку (как правило, 512 байт), есть смысл так заморачиваться с записью/чтением размера строки, или лучше всё-таки писать/читать буфер достаточного размера?
2. Если уж писать "как надо", то каждую операцию с файлом (открытие, чтение/запись, закрытие) нужно проверять на предмет возникновения ошибок.
3. Ну и смешение С и С++ стиля тоже считается порочной практикой (это я про new/delete в программе вроде бы на С...)
Yandex
Объявления
23.07.2011, 02:32     Считывание из бинарника
Ответ Создать тему
Опции темы

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