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];
};
fread помогите прочитать
Идея у меня такая - создать многомерный массив символный, и в него читать значения. открыть - fopen, читать fread
Я встречал примеры - но для одномерных массивов - а как если даных много??? помогите примерчиком!!!
файл который нужно расшыфровать тут.
Цитата: chipic128
Идея у меня такая - создать многомерный массив символный, и в него читать значения. открыть - fopen, читать fread
Я встречал примеры - но для одномерных массивов - а как если даных много??? помогите примерчиком!!!
Если вы не знаете структуры этого файла, то по любому - файл это всего лишь набор байтов и в какие массивы его не считывай (многомерные, одномерные), этого не изменить. Что вам даст то, что вы считаете эти байты в многомерный массив - совсем непонятно. Возможно я просто не понял, что вы хотите?
Файл содержит базу данных о предприятиях на украинском языке.
Каждая запись имеет длину 70 байт(те в файле 1402 записи)
Структуру записи можно представить следующим образом:
Код:
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;
}
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;
}
там проблема состоит вот в чем:
есть код района і к етому району прилагается перечень кодов предприятий 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
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
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