Tutorial für Datei Parser



  • Hallo

    Ich wollt mal wissen, ob es ein Tutorial oder ähnliches gibt, um einen ordentlichen Datei Parser zu schreiben. Ich hab nämlich momentan recht oft den Fall, dass ich den Inhalt einer Struktur in eine Datei schreibe und auch später lesen will (nicht auf Byteebene). Die Datei sollte aus meheren Zeilen solcher Art bestehen:

    name=wert\n
    name=wert....

    Parsen und schreiben dieser Dateien ist gar nicht mal so schwer, mit fprintf und fgets/sscanf kann man den Inhalt ja schreiben und lesen, allerdings sollte da die Reihenfolge der Werte nicht entscheidend sein. Wie kriegt man so etwas am besten hin? Gibts da gute Tutorials oder einfach n Codeschnipsel?





  • Du Strukturierst deine Datei so:

    NAME1= WERT1 [ZEILENUMBRUCH]
    NAME2= WERT2 [ZEILENUMBRUCH]
    [...]

    So hab ich mein Config File ausgewertet. Ich denk das sollte helfen:

    void set_config()
    {
    	FILE *config;
    	int count=1;
    	char *line, *expression;
    
    	if((config=fopen("chat_server.conf","r"))==NULL)
    	{
    		printf(" - Kein Config File gefunden\n");
    	}
    	else
    	{
    		if((line=(char *)malloc(255*sizeof(char)))==NULL)
    		{
    			error(4,0);
    		}
    
    		/*Zeile für Zeile das Config File lesen und auswerten*/
    		while((fgets(line,255,config))!=NULL)
    		{
    			/*Leerzeile oder Kommentar?*/
    			if(line[0]!='#'&&line[0]!='\n')
    			{
    				/*Ist "PORT=" Teil der Zeile?*/
    				if((expression=strstr(line,"PORT="))!=NULL)
    				{
    					port=atoi(expression+6);
    					if(port<1||port>65535)
    					{
    						error(5,count);
    					}
    				}
    				else if((expression=strstr(line,"CLIENTS="))!=NULL)
    				{
    					client_anzahl=atoi(expression+9);
    					if(client_anzahl<1||client_anzahl>1000)
    					{
    						error(5,count);
    					}
    				}
    				else if((expression=strstr(line,"SHOW="))!=NULL)
    				{
    					if((strstr(expression+6,"YES"))!=NULL)
    					{
    						show_chat=1;
    					}
    				}
    				else if((expression=strstr(line,"LOG="))!=NULL)
    				{
    					if((strstr(expression+5,"YES"))!=NULL)
    					{
    						log_on=1;
    						log_datei=fopen("chat_log","r+");
    						fseek(log_datei,0,SEEK_END);
    					}
    				}
    				else if((expression=strstr(line,"ALL_IP="))!=NULL)
    				{
    					if((strstr(expression+8,"YES"))!=NULL)
    					{
    						all_ip=1;
    					}
    				}
    				else if((expression=strstr(line,"DELAY="))!=NULL)
    				{
    					delay=atoi(expression+7);
    					if(delay<1||delay>1000)
    					{
    						error(5,count);
    					}
    				}
    				else if((expression=strstr(line,"TIMEOUT="))!=NULL)
    				{
    					timeout=1000*(atoi(expression+9));
    					if(timeout<0||timeout>60000)
    					{
    						error(5,count);
    					}
    
    				}
    				else /*Zeile Enthält undefinierte Zeichenkette -> Fehlerausgabe*/
    				{
    					error(5,count);
    				}
    			}
    			count++;
    		}
    		free(line);
    		printf(" - Config File wurde gelesen\n");
    	}
    }
    


  • Danke, das hat mich schon weitergebracht 🙂



  • Hab mir jetzt nen eigenen Parser geschrieben, der die Zeilen nicht einzeln einliest, sondern einen kompletten String bearbeitet, ziemlich aufwendig und umfangreich, funzt aber sehr gut.



  • Wenn's einmal diesen Level der Komplexität erreicht, sollte man sich überlegen, ob ein XML-Parser nicht das Richtige wäre, davon gibts einige. Jede wie auch immer geartete strukturierte Information lässt sich in XML formulieren; die notwendigen Routinen finden sich mit Sicherheit in so mancher Bibliothek.



  • Wenn du eine kennst und hier posten könntest, wäre mir weitergeholfen 🙂


Anmelden zum Antworten