streams dateien und eben diese auslesen

SpecialT

Neuling
Thread Starter
Mitglied seit
19.03.2005
Beiträge
614
Ort
Itzehoe
hallo

ich habe jetzt bereits einige erfahrung in c++ gesammelt und kann mir dasa meiste auch selbst zusammenreimen, aber ich stehe jetzt vor einem problem wo ich eure hilfe brauche :)


ich nutze übrigens den Borland c++ Builder 6

also ich möchte eine *.txt datei anlegen in dem immer zwei werte pro zeile stehen beide getrennt durch ein simikolon.

also etwa so

izkhasjdf;98654
iaksbhwr;8574
jas;564
asiuefkjhjkja;21


diese werte möchte ich mit einem programm auslesen und in dem programm verwenden.

im netz habe ich bereitsherraus gefunden, dass man so etwas entweder mit streams oder mit SQL realisieren kann. ich habe jedoch von beiden überhaupt keinen schimmer... ein bekannter meinte jedoch das SQL viel zu komplex wäre.

kann mir da jemand weiter helfen?

am besten auch mit einer erklärung was diese streams bezwecken, denn aus der bcb6hilfe werd ich nicht so ganz schlau


danke schonmal

gruß
ST
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
// ANSI C

FILE* file;
char zeile[100];
char wert1[40];
char wert2[40];
char* ch;

if((file = fopen("filename", "r")) == NULL)
// Meldung und zurück!!!

while(fgets(zeile, sizeof(zeile), file) != NULL)
{
ch = strchr(zeile, ';');
*ch = 0x00;
strcpy(wert1, zeile);
ch += 1;
memset(wert2, 0x00, sizeof(wert2));
memmove(wert2, ch, strlen(ch) - 1);
}

fclose(file);
 
hallo

danke schon mal für deine hilfe :)

ich probiere das heute nachmittag dann gleich mal aus

ich wäre jedoch über eine kleine beschreibung dieses codes sehr dankbar.. ich schreibe nämlich ungern etwas in mein programm ohne zu wissen was da passiert.. ich will ja schließlich noch was lernen ;)


gruß
ST
 
Zuletzt bearbeitet:
// In ANSI C werden Dateien (files) über einen
// Dateizeiger (File-Pointer) vom Typ FILE verwaltet,
// der in der Headerdatei stdio.h deklariert ist.
FILE* file;

// fgets liest einen String aus stream in den durch s
// angegebenen String und bricht ab, wenn entweder ein
// Zeilenvorschub (\n) gelesen wird oder n-1 Zeichen
// gelesen wurden. Der Zeilenvorschub wird am Ende von s
// gespeichert. Anschließend hängt fgets automatisch ein
// Nullzeichen (\0) an, um das Ende des Strings zu markieren.
// fgets liefert bei fehlerfreier Ausführung den durch s
// bezeichneten String zurück. Bei Erreichen des Dateiendes
// oder im Fehlerfall ist der Rückgabewert NULL.
char* fgets(char* s, int n, FILE* stream);

// strchr sucht den über s angegebenen String nach dem
// Zeichen c ab, wobei die Suche mit dem ersten Zeichen
// von s beginnt. strchr findet die erste Fundstelle des
// Zeichens c im String s.
// fgets liefert bei fehlerfreier Ausführung den durch s
// bezeichneten String zurück. Bei Erreichen des Dateiendes
// oder im Fehlerfall ist der Rückgabewert NULL.
char* strchr(const char *s, int c);

while(fgets(zeile, sizeof(zeile), file) != NULL)
{
ch = strchr(zeile, ';'); // das Semikolon suchen
if(ch) // wenn gefunden
{
*ch = 0x00; // durch Nullzeichen (\0) ersetzen
strcpy(wert1, zeile);
ch += 1; // Anfang des 2. Wertes

// weil der Zeilenvorschub am Ende gespeichert wurde
// deswegen strlen(ch) - 1
memset(wert2, 0x00, sizeof(wert2));
memmove(wert2, ch, strlen(ch) - 1);

/* oder so
strcpy(wert2, ch);
ch = strchr(wert2, '\n'); // den Zeilenvorschub suchen
if(ch)
*ch = 0x00;
*/
}
}
Hinzugefügter Post:
// strchr sucht den über s angegebenen String nach dem
// Zeichen c ab, wobei die Suche mit dem ersten Zeichen
// von s beginnt. strchr findet die erste Fundstelle des
// Zeichens c im String s.

korrigiert!!!!!!!!!!!!!

// strchr liefert einen Zeiger auf die erste Fundstelle des Zeichens c
// im String s zurück bzw. den Wert NULL, wenn der String dieses
// Zeichen nicht enthält.

char* strchr(const char *s, int c);
Hinzugefügter Post:
Etwas sehr wichtiges vergessen!!!!!


while(!feof(file))
{

if(fgets(zeile, sizeof(zeile), file) != NULL)
{
ch = strchr(zeile, ';'); // das Semikolon suchen
if(ch) // wenn gefunden
{
*ch = 0x00; // durch Nullzeichen (\0) ersetzen
strcpy(wert1, zeile);
ch += 1; // Anfang des 2. Wertes

// weil der Zeilenvorschub am Ende gespeichert wurde
// deswegen strlen(ch) - 1
memset(wert2, 0x00, sizeof(wert2));
memmove(wert2, ch, strlen(ch) - 1);

/* oder so
strcpy(wert2, ch);
ch = strchr(wert2, '\n'); // den Zeilenvorschub suchen
if(ch)
*ch = 0x00;
*/
}
}

}
 
Zuletzt bearbeitet:
hey echt tausend dank für deine nicht so ausführlich erwartete hilfe :)


hmm ich verstehe das aber noch nicht was ich damit jetzt anfangen kann... bzw wie ich jetzt auf die strings zu greifen kann.

kurz zu meinen vorhaben :

ich möchte eben diese liste / *.txt datei auslesen und den ersten wert in als item in eine ComboBox setzen. und wenn ich einen dieser items in laufzeit auswähle soll der zweite wert der *.txt dateie in einem editfeld erscheinen...

wie stelle ich das an?

ich habe jetzt deinen code in mein quellcode eingefügt, er wird auch vom compiler geschluckt aber ich bekomme es nicht hin auf "wert1" und "wert2" zuzugreifen


danke
gruß
St
 
// Ein schmutziger Trick, aber sehr effektiv!

char entry[400];

strcpy(entry, wert1);
strcat(entry, "---------------------------------------------------------;");
strcat(entry, wert2);
combobox.AddString(entry);
// man sieht nur Wert1, Wert2 ist versteckt dahinter, also statt "-" das Leerzeichen " " so viel wie möglich füllen!

int index = combobox.GetSelIndex();
combobox.GetString(entry, index);
ch = strchr(entry, ';');
if(ch)
edit.SetText(ch);
 
//
//
// Eine "saubere Lösung", lehrbuchmäßig!
//
combobox.AddString(wert1);

//
wert12[40];
int index = combobox.GetSelIndex();
combobox.GetString(wert1, index);

if((file = fopen("filename", "r")) != NULL)
{
while(!feof(file))
{
if(fgets(zeile, sizeof(zeile), file) != NULL)
{
ch = strchr(zeile, ';');
if(ch)
{
memset(wert12, 0x00, sizeof(wert12));
memmove(wert12, zeile, ch - zeile);
if(strcmp(wert1, wert12) == 0)
{
edit.SetText(ch + 1);
break;
}
}
}
}
fclose(file);
}
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh