Parameter aus einer Textdatei auslesen und damit ein externes Programm starten



  • Ich habe eine Liste in einer Textdatei die ungefähr so aussehen kann:
    01:30, 01:40
    03:34, 04:20
    21:30, 21:45
    usw.

    jetzt will ich jede zeile auslesen und die zahl vor dem komma und die danach jeweils automatisch als parameter für ein externes programm verwenden das ich starten will.

    Ich bin soweit gekommen dass ich die Werte in einem Array speichern und auf dem bildschirm ausgeben kann. aber nicht weiter.
    Hat jemand eine Idee für mich?

    main (void){
    FILE *stream;
    
    int zaehler = 0;
    char werte[100];
    int ch;
    int pos=0, min=0;
    
    	if((stream = fopen("test.txt","r")) == NULL){
    		printf("\nFehler beim Oeffnen!");
    		exit(1);
    	}
    
    	while(!feof(stream)){
    
    		ch =fgetc(stream);
    		werte[zaehler] = ch;
    		zaehler++;
    		}
    		werte[zaehler] = '\0';
    		fclose(stream);
    
    		printf("%s", werte);
    
    printf("\n\n");
    
    }
    


  • Schau dir mal fscanf() oder sscanf() an. Zudem könnte fgets() hilfreich sein, wenn du die Zeichen nicht einzeln sondern zeilenweise auslesen willst.

    In Zukunft bitte [cpp]-Tags verwenden.



  • fscanf war ein guter tipp. danke.
    ich habe jetzt ein 2 dimensionales array wo ich bei werte[x][0] die zahl links neben dem komma und bei werte[x][1] die zahl rechts neben dem komma speichern möchte.
    so wie es jetzt ist wird jede einzelne zeile bei [x][0] gespeichert.

    int werte[2][20]={0},i=0;
    	FILE *fp;
    
    	fp = fopen("test.txt","r");
    		while(!feof(fp)){
    			fscanf(fp,"%i,%i",&werte[0][i],&werte[1][i]);
    			i++;
    		}
    		fclose(fp);
    
    		for(int j=0;j<20;j++){
    			printf("%i:  1: %i, - 2: %i, \n",j,werte[0][j],	werte[1][j]);
    		}
    


  • Wenn du in der Datei Uhrzeitwerte drinhast ("01:30" etc.), kannst du die nicht als int auslesen ("%i,%i" erwartet zwei durch Komma getrennte Ganzzahlen, das nach der ersten erkannten Zahl ein ":" kommt, wird dort mit Lesen abgebrochen).

    PS: Außerdem solltest du eventuell darauf achten, daß dein Speicher nicht überläuft - das könnte ungesund werden, wenn mehr als 20 Datensätze in deiner Datei stehen.



  • ok ich habe jetzt eine möglichkeit gefunden womit ich die anfangs und stop zeit in eine variable speichern kann. jetzt muss ich diese zeiten nur noch in den programmaufruf einbauen können.

    so funktioniert es anscheinend nicht.
    irgendwo ist ein denkfehler.

    /* fgetc1.c */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (void){
    FILE *stream;
    
    int zaehler = 0;
    char werte[100];
    int ch;
    char *befehl;
    char *ptr;
    int i=1;
    	char *start,*stop;
    
    	if((stream = fopen("test.txt","r")) == NULL){
    		printf("\nFehler beim Oeffnen!");
    		exit(1);
    	}
    
    	while(!feof(stream)){
    
    		ch =fgetc(stream);
    		werte[zaehler] = ch;
    		zaehler++;
    		}
    		werte[zaehler] = '\0';
    		fclose(stream);
    
    		ptr = strtok(werte, ",\n");
    
    		while(ptr != NULL) {
          		//printf("% d.: %s\n",i++,ptr);
    
    			i++;	
    				if( i % 2 == 0 ){
    				start=ptr;
    				printf("\n->%s\n",start);	
    			}
    			else{
    				stop=ptr;
    				//printf("\n->%s\n",stop);
    
    				befehl="asfbin -i test.wmv -o out.wmv ";
    				strcat(befehl,stop);
    				strcat(befehl," -start ");
    				strcat(befehl,stop);
    				system(befehl);
    
    			}
    
    			//	i++;*/
          		ptr = strtok(NULL, ",\n");
    
      		}
    
    printf("\n\n");
    
    }
    


  • Das fallen mir auf Anhieb zwei Fehler auf:
    1. 'befehl' zeigt auf ein String-Literal und die liegen üblicherweise in einem Speicherbereich, den du nicht ändern darfst. Reservier' dir lieber ein eigenes char-Array und kopier dein Kommando dort rein (evt. auch mit sprintf()).
    2. Ist es Absicht, daß du zweimal den stop-Wert in den Befehl einfügst?

    PS: Nützlich bei der Fehlersuche sind auch Debugger oder einfache Debug-Ausgaben (bei dir könnte ein printf(befehl); vor dem system() schon ausreichen).


Anmelden zum Antworten