serielle schnitstelle zum x-ten mal!
-
Ja, das Problem habe ich auch erkannt, aber komme nicht weiter;
Ich weiss nicht wie ich zu der zweite Zeile der INI Datei kommen soll;
Es ist mir klar das ich zum Beispiel char bau[50] brauche um den Wetrt vom Baudrate zu speichern, und weis das die Abfrage enlich wie bei wert sein soll, aber ich habe das Problem in die zweite Zeile zu kommen;
-
Hi nochmal,
einfach "fgets" in einer Schleife solange ausführen, bis das Ende der Datei erreicht ist. Innerhalb der Schleife jeweils die Verarbeitung der for-Schleife, wie Du sie schon programmiert hast, ausführen und das für jeden gelesenen String der Datei.
Sorry, mehr kann ich erst heute abend schreiben, wenn es dann noch notwendig ist. Such einfach mal in der MSDN nach while, eof oder FILE, dann findest Du bestimmt ein Beispiel, wenn nicht, melde Dich nochmal :p
Gruß
Oliver
[ Dieser Beitrag wurde am 16.01.2003 um 14:05 Uhr von oj0169 editiert. ]
-
Ich versuche es und wenn es nicht klappt melde ich mich heute Abend noch mal!
Danke!
-
Hallo,
ich bin dran, es dauert einen Moment ...
Gruß
Oliver
-
Hi,
also hier jetzt der mögliche Code: (Vors.: Jede Zeile der Datei wird mit ";" abgeschlossen!!)
Sorry, aber der eine Free()-Befehl führt zum Absturz, vielleicht hat einer eine Idee, warum?Aber so kann man es grundsätzlich machen.
GrußOliver
So sieht die Datei aus:
Aktuelleschnitstelle=COM1;
Baudrate=9600;
Datenbits=8;
Parität=Keine;
Stopbits=1;
Datenfluss=ON;#include "stdafx.h" #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> int ini(void) { FILE *File; char *msg; char *wert; int PORT; int BAUD; msg = (char *) malloc(80); wert = (char *) malloc(80); File = fopen("c:\\Projekt\\komm.ini","r"); if (File != NULL) { while(!feof(File)) { fgets(msg,80,File); wert = strtok((char *) msg, (const char *) "="); if (strcmp(wert,"Aktuelleschnitstelle")==0) { wert = strtok((char *) NULL, (const char *) ";"); PORT=0x3F8; printf("\n Der Port ist: %s", wert); } if (strcmp(wert,"Baudrate")==0) { wert = strtok((char *) NULL, (const char *) ";"); BAUD=atoi(wert); printf("\n Die Baudrate ist: %s", wert); } if (strcmp(wert,"Datenfluss")==0) { wert = strtok((char *) NULL, (const char *) ";"); printf("\n Der Datenfluss ist : %s", wert); } } fclose(File); } else { printf("Datei nicht vorhanden!"); } //free( wert ); free( msg ); printf("\n\n"); gets(wert); return 0; } int main(int argc, char* argv[]) { int retcode = ini(); return 0; }
-
moin meister ...
strtok liefert einen Zeiger auf den Beginn der gefundenen Zeichenfolge in s1 zurück. Wenn keine weitere Zeichenfolge gefunden wird, ist der Rückgabewert NULL.
.... while(!feof(File)) { fgets(msg,80,File); wert = strtok((char *) msg, (const char *) "="); ....
ich vermute mal, dass in der ini-Datei als auch nach der letzen Zeile ein
Zeilenumbruch steht.
Wenn das so ist liest du die letzte Zeile ein, das Dateiende ist aber noch nicht
erreicht, weil fgets bis zum Zeilenumbruch liest, es müsste aber praktisch weiter lesen um festzustellen, dass das Dateiende erreicht ist.Also wird die Schleife nach der letzen Zeile nicht abgebrochen, und fget wird wieder aufgerufen, jetzt wird das Dateiende erreicht, was in msg steht weiss ich nicht w*****einlich NULL. Daraufhin wird strtok((char*) 'NULL', ...); aufgerufen, was wiederum zur Folge hat, dass wert = NULL gesetzt wird.
Die Schleife wird nun abgebrochen weil eof erreicht und
free(wert) oder free(NULL) ! aufgerufen -> Absturtz.ohne die Schleifenlogik zu ändern würde ich einen BackupZeiger für wert einrichten und wie folgt verwenden ...
char *wert_bup; .... while(!feof(File)) { fgets(msg,80,File); wert_bup = wert; wert = strtok((char *) msg, (const char *) "="); if(wert == NULL) wert = wert_bup; .... } free(wert);
-
N'Abend größter aller Meister,
Ah jetzt ja! Das könnte eine mögliche Erklärung sein! Hmmmhh, aber ganz verstanden habe ich das noch nicht. Also, der Wert von "Wert" ist zuletzt "Null"? Und deswegen kann ich den mit malloc allokierten Datenspeicher nicht über free freigeben
?? Könnte der größte aller Meister dazu vielleicht noch was sagen?
Danke!
Oliver
[ Dieser Beitrag wurde am 18.01.2003 um 21:15 Uhr von oj0169 editiert. ]
-
hi, warum so umstaendlich........ um eine .ini datei auszulesen brauchst du nur folgende funktion GetPrivateProfileString()
-
Hi,
weil ich die Funktion nicht kannte!!??!!
[ Dieser Beitrag wurde am 20.01.2003 um 07:00 Uhr von oj0169 editiert. ]
-
Danke für die Lösung..
Mensch da bekommt man ja echt kopfschmerzen sorry aber wenn ich schon INI Dateien verwende, dann nimm bitte auch die dazugehörigen Informationen wie GetPrivateProfileString etc. (siehe toom)
Da kannst du dir das ganze Parsen der Datei sparen..Das tut wirklich weh....
Sorry nicht persönlich nehmen..
-
Danke leute!(OLIVER)
Ihr hat mir echt geholfen!:)!
-
Hallo,
ja, Ihr habt mir auch geholfen. Ich brauche dasselbe nämlich auch demnächst.
Vielen Dank.
Oliver
-
moin meister ...
Ich glaube das Problem mit den Ini´s hat sich gelöst ...
Zu dem Problem mit dem free ... kurz nochmal:
main()
{
char* szWert = (char*) malloc(80);
szWert = NULL;
free(szWert); // *knall*
return 0;
}und nicht anderes macht dein Programm beim lesen der letzen Zeile, weil in der letzen Zeile offensichtlich nichts mehr drinn steht, weil die vorletzte Zeile mit einen '\n' endet.
mfg
RB