Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

fread помогите прочитать

16K
06 августа 2008 года
chipic128
8 / / 13.07.2006
есть файл, - похоже на БД, в нем есть поля, даные в них (вроде) байтовые, - проблема в том, что я не знаю структуры ентого файла БД, а его нужно прочитать.

Идея у меня такая - создать многомерный массив символный, и в него читать значения. открыть - fopen, читать fread
Я встречал примеры - но для одномерных массивов - а как если даных много??? помогите примерчиком!!!

файл который нужно расшыфровать тут.
288
06 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: chipic128

Идея у меня такая - создать многомерный массив символный, и в него читать значения. открыть - fopen, читать fread
Я встречал примеры - но для одномерных массивов - а как если даных много??? помогите примерчиком!!!



Если вы не знаете структуры этого файла, то по любому - файл это всего лишь набор байтов и в какие массивы его не считывай (многомерные, одномерные), этого не изменить. Что вам даст то, что вы считаете эти байты в многомерный массив - совсем непонятно. Возможно я просто не понял, что вы хотите?

1.9K
06 августа 2008 года
max_dark
256 / / 11.11.2005
Я прочитал этот файлик :D
Файл содержит базу данных о предприятиях на украинском языке.
Каждая запись имеет длину 70 байт(те в файле 1402 записи)
Структуру записи можно представить следующим образом:
Код:
struct dbdata {
    char x; // ??? 3 or 1
    char len1; // length(num1) = 6
    char num1[6];
    char len2; // length(num2) = 6
    char num2[6];
    char len3; // length(num3) = 8
    char num3[10]
    char len4; // length(num4) = 8
    char num4[10];
    char len5; // length(text) > 10, variable
    char text[32];
};

num1-num4 - какие-то номера(похоже на почтовый индекс или №телефона)
text - описание организации
Со структурой разбрались, теперь дело техники
Код:
int readblock(FILE* f,struct dbdata* block) {
    char rawblock[70];
    char offset=0;
    memset(block,0,sizeof(struct dbdata));
    memset(rawblock,0,70);
    fread(rawblock,70,1,f);
    // здесь заполняем структуру
    return 1;
}
// .....

long filesize(FILE*f) {
    long result=0;
    fseek(f, 0, SEEK_END);
    result = ftell(f);
    rewind(f);
    return result;
}
int main(int argc, char** argv) {
    struct dbdata* data=NULL;
    FILE* f=NULL;
    long size=0;
    long count=0;
    long i=0;
    if ((f=fopen(argv[1],"rb"))==NULL) {
        puts("Cannt open file");
        return -2;
    }
    size=filesize(f);
    if (((size % 70)!=0)||(size == 0)) {
        puts("Size is not correct");
        fclose(f);
        return -3;
    }
    count=size/70;
    data=(struct dbdata*)calloc(count,sizeof(struct dbdata));
    if(data) {
        for(;i<count;i++) {
            readblock(f, &data);
        }
        free(data);
    }
    else {
        puts("No memory");
    }
    fclose(f);
    return 0;
}
16K
12 августа 2008 года
chipic128
8 / / 13.07.2006
да спассибо, с ентим я разабрался сам, но вот тут надо еще раскрутить такую штуку - файл прикрепляю, имеется еще пример читания с ВБ,
там проблема состоит вот в чем:
есть код района і к етому району прилагается перечень кодов предприятий 36хххх (10 символов),... ну вот, в Visual Basic есть возможность динамических массивов, т.е. я не знаю сколько там етих кодов предприятий будет... в ВБ я так понял всеравно, он сам орпеделяет их количество с помощю дин. мас.
Код:
Private Type TypeNRah
 NRah(10) As Byte       ' код предприятия 36хххх 10 символов
End Type
Private Type TypeRaion
 Ind As Integer         ' индекс района
 rName(30) As Byte      ' Назва района 30 символов
 spPok() As TypeNRah    ' Список предприятий района
End Type
Private Type TypeMaket
 Raion() As TypeRaion   ' Список районов
 spProd() As TypeNRah   ' Список мат. ценностей
End Type

Private Maket As TypeMaket


 
Код:
Public Sub LoadMaket(Optional pth)
 Dim fr As Integer, s As String
 If IsMissing(pth) Then s = App.Path Else s = pth
 fr = FreeFile: If Right$(s, 1) = "\" Then s = s & "MAK.DAT" Else s = s & "\MAK.DAT"
 Open s For Binary As fr: Get #fr, 1, Maket: Close #fr
End Sub
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог