ReSeT
11-01-2003, 13:17
Hallo zusammen!
Folgendes Problem:
Ich habe ein kleines Programm geschrieben, welches eine Adressdatei einliest, die aus einem Warenwirtschaftssystem als Textdatei exportiert worden ist. Die Datensätze umfassen jeweils 38 Felder, bestehend aus Strings. Die einzelnen Felder sind jeweils durch Semikolon getrennt. Der jeweils nächste Datensatz ist in der Datei nicht näher gekennzeichnet, daher muß also jeder Datensatz abgezählt werden.
Hier zunächst der Code zum Öffnen der Datei
adress.h
#define MAXFIELDS 38
#define MAXADDR 2000
typedef struct {
int number;
char field[MAXFIELDS][42];
}t_adress;
adress.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "adress.h"
int open_ascii_adress_file(char *filename,t_adress *adresse[])
{
FILE *fd;
int count = 0;
int entry = 0;
int row = 0;
int line = 0;
char c;
char buffer[42];
if ((fd = fopen(filename,"r")) == NULL) fprintf(stderr,"Error opening %s \n",filename);
while ((c = getc(fd)) != EOF) {
if (c == ';') {
if (count == 38) {
count = 0;
entry++;
}
buffer[row++] = '\0';
if ((adresse[entry] = malloc(sizeof(t_adress))) == NULL)
fprintf(stderr,"Memory allocation failed");
exit(1);
}
strncpy(adresse[entry]->field[count],buffer,strlen(buffer));
/*
if (strlen(adresse[entry]->field[count]) >= 1) {
printf("ID %d SLOT %d", entry, count);
printf(" -> %s\n ",adresse[entry]->field[count]);
}
*/
row = 0;
count++;
continue;
}
if ( isprint(c) || isdigit(c) ) buffer[row++] = c;
}
fclose(fd);
return entry;
}
Diese Funktion liefert die Anzahl der Einträge zurück und schreibt die einzelnen Felder in eine Struktur. Zur Struktur referenziere ich über einen Pointer, den ich aus einem Array lese.
Das Programm:
#include <stdio.h>
#include <stdlib.h>
#include "adress.h"
int main()
{
char *filename = "A01.TXT";
t_adress *my_adresses[MAXADDR];
int entries, i;
int entry = 0;
char ch;
entries = open_ascii_adress_file(filename,my_adresses);
do {
for (i = 0;i < MAXFIELDS;i++)
printf("%d: %s\n",entry,my_adresses[entry]->field[i]);
entry++;
ch = getc(stdin);
} while ( (entry < entries) && (ch != 'q') && (ch != 'Q'));
return 0;
}
Da ich ja der Funktion open_ascii_adress_file einen Array von Pointern auf Strukturen übergebe, müsste diese Funktion die Strukturen ja direkt über die Zeiger ändern können. Innerhalb der Funktion sind die Daten ja vorhanden, wie ich durch den auskommentierten Teil nachweisen kann. Möchte ich die Daten in main() ausgeben, erhalte ich eine leere Ausgabe. Ich verstehe an dieser Stelle nicht warum, da ich ja alle Daten über Zeiger anspreche. Habe ich hier grundsätzlich etwas nicht verstanden, oder lediglich eine Kleinigkeit übersehen?
Folgendes Problem:
Ich habe ein kleines Programm geschrieben, welches eine Adressdatei einliest, die aus einem Warenwirtschaftssystem als Textdatei exportiert worden ist. Die Datensätze umfassen jeweils 38 Felder, bestehend aus Strings. Die einzelnen Felder sind jeweils durch Semikolon getrennt. Der jeweils nächste Datensatz ist in der Datei nicht näher gekennzeichnet, daher muß also jeder Datensatz abgezählt werden.
Hier zunächst der Code zum Öffnen der Datei
adress.h
#define MAXFIELDS 38
#define MAXADDR 2000
typedef struct {
int number;
char field[MAXFIELDS][42];
}t_adress;
adress.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "adress.h"
int open_ascii_adress_file(char *filename,t_adress *adresse[])
{
FILE *fd;
int count = 0;
int entry = 0;
int row = 0;
int line = 0;
char c;
char buffer[42];
if ((fd = fopen(filename,"r")) == NULL) fprintf(stderr,"Error opening %s \n",filename);
while ((c = getc(fd)) != EOF) {
if (c == ';') {
if (count == 38) {
count = 0;
entry++;
}
buffer[row++] = '\0';
if ((adresse[entry] = malloc(sizeof(t_adress))) == NULL)
fprintf(stderr,"Memory allocation failed");
exit(1);
}
strncpy(adresse[entry]->field[count],buffer,strlen(buffer));
/*
if (strlen(adresse[entry]->field[count]) >= 1) {
printf("ID %d SLOT %d", entry, count);
printf(" -> %s\n ",adresse[entry]->field[count]);
}
*/
row = 0;
count++;
continue;
}
if ( isprint(c) || isdigit(c) ) buffer[row++] = c;
}
fclose(fd);
return entry;
}
Diese Funktion liefert die Anzahl der Einträge zurück und schreibt die einzelnen Felder in eine Struktur. Zur Struktur referenziere ich über einen Pointer, den ich aus einem Array lese.
Das Programm:
#include <stdio.h>
#include <stdlib.h>
#include "adress.h"
int main()
{
char *filename = "A01.TXT";
t_adress *my_adresses[MAXADDR];
int entries, i;
int entry = 0;
char ch;
entries = open_ascii_adress_file(filename,my_adresses);
do {
for (i = 0;i < MAXFIELDS;i++)
printf("%d: %s\n",entry,my_adresses[entry]->field[i]);
entry++;
ch = getc(stdin);
} while ( (entry < entries) && (ch != 'q') && (ch != 'Q'));
return 0;
}
Da ich ja der Funktion open_ascii_adress_file einen Array von Pointern auf Strukturen übergebe, müsste diese Funktion die Strukturen ja direkt über die Zeiger ändern können. Innerhalb der Funktion sind die Daten ja vorhanden, wie ich durch den auskommentierten Teil nachweisen kann. Möchte ich die Daten in main() ausgeben, erhalte ich eine leere Ausgabe. Ich verstehe an dieser Stelle nicht warum, da ich ja alle Daten über Zeiger anspreche. Habe ich hier grundsätzlich etwas nicht verstanden, oder lediglich eine Kleinigkeit übersehen?