Eine bestimmte Zeile aus einer Datei lesen und als Parameter verwenden



  • Hallo,

    könnt Ihr mir vielleicht helfen? Brauche eine gute Idee.
    Ich möchte aus einer Datei eine bestimmte Zeile lesen und die weiter als Parameter verwenden: gestarten wird das Programm mit "Programmname" 1234
    [code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(int argc, char *argv[]) //Parameter einlesen

    {
    system("cls");

    int ch; // Es wird nur ein Parametersatz verwendet
    if (argc <= 1)
    {printf("zu wenige Parameter");
    exit(1);
    }

    if (argc >= 3)
    {printf("zu viele Parameter");
    exit(1);
    }
    if (argc == 2)
    {printf("Parameter korrekt geladen");
    }

    printf("\nParameter %s wird geladen\n",argv[1]); //Parameter wird nochmals angezeiget
    system("PAUSE");
    char dateivar[1000]; //Variable für die Datei
    FILE *datei;
    datei = fopen("visu.dat", "a");//Datei wird geöffnet
    if(datei != NULL)
    {
    printf("\nDatei geöffnet\n");
    system("PAUSE"); //Pause, damit gesehen wird, ob Datei offen ist

    //fclose(datei);
    printf("\nDatei geschlossen\n");
    }

    system("PAUSE");
    return 0;

    Jetzt möchte ich mit dem geladenen Parameter (1234) die geöffnete Datei durchsuchen und die Zeilen bei dieser Position auslesen.
    Habe es mit"strstr" versucht, kann aber die Datei nicht in eine Variable laden.?
    Könnt Ihr mir helfen?

    Danke für eure Hilfe

    Metas



  • Zunächst mal eine Korrektur:

    datei = fopen("visu.dat", "a");//Datei wird geöffnet
    

    "a" öffnet die Datei im Modus 'append', sprich anhängen.
    Ist aber eigentlcih für Schreibzugriffe gedacht.

    Du solltest die Datei lieber im Modus "r" öffnen.
    Für 'read'.

    Hier mal zum Nachlesen:
    http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/fopen.html

    Gruß,
    DC



  • Hallöchen,
    Habe schon die Foren durchsucht und leider nichts passendens gefunden.
    Die Datei sieht folgendermassen aus:

    [code]
    [1234]
    1, 3, 4, 6, Hier sollte dann ein wenig Text kommen der in einem string eingelesen weden soll,



  • Also für eine solche Datei wäre ein passender Algorythmus:

    1. Eine Zeile einlesen in buffer[].
    2. buffer[] nach 1234 durchsuchen.
    1234 nicht gefunden, nächste Zeile überspringen und bei 1. weitermachen.
    1234 gefunden, nächste Zeile einlesen und entsprechend zerlegen, wie man sie braucht.



  • So, habe mal etwas zusammengekleistert.
    Ist nicht C gerecht, weil //-Kommentare c++ sind.
    Aber ich habe nicht damit angefangen.

    int main ...... blabla...
    {
    .
    .
    .
    .
    .
    char dateivar[1000]; //Variable für die Datei
    char buffer[1000];   //Variable für den Vergleichsbuffer
    FILE *datei;
    datei = fopen("visu.dat", "r");//Datei wird geöffnet
    if(datei != NULL)
    {
    printf("\nDatei geöffnet\n");
    system("PAUSE"); //Pause, damit gesehen wird, ob Datei offen ist
    }
    
    while (fgets(buffer,999,datei))      //Zeile in buffer laden
           {
    if (strstr (buffer,"1234"))         //buffer nach parameter durchsuchen
    {
    printf("%s",buffer);            //wenn gefunden, dann ausgeben
    fgets(dateivar,999,datei);     //und nächste Zeile in dateivar einlesen.
    printf("%s",dateivar);        //und ausgeben.
    }
    else fgets(buffer,999,datei);   //Ansonsten eine Zeile überspringen.
           }
    
    fclose(datei);
    printf("\nDatei geschlossen\n");
    
    //dateivar verarbeiten...
    
    system("PAUSE");
    return 0;
    }
    

    Nun muß nur noch dateivar entsprechend zerlegt und verarbeitet werden.



  • Don Carsto schrieb:

    Also für eine solche Datei wäre ein passender Algorythmus:

    1. Eine Zeile einlesen in buffer[].
    2. buffer[] nach 1234 durchsuchen.
    1234 nicht gefunden, nächste Zeile überspringen und bei 1. weitermachen.

    Wieso nächste Zeile überspringen?



  • Weil Datei so aufgebaut ist:

    [1234]
    1, 4 ,5 ,6 Blabla..
    [3456]
    3, 5, 6, 7, BlubbBlubb
    .
    .
    usw.
    

    Jede 2.Zeile enthält die Suchparameter.
    Darauf folgt die eigentliche Zeile die verarbeitet werden soll.



  • Na dann ...
    das habe ich den Angaben so nicht entnommen. Insbesondere würde ich nach dem, was der TE hier geschrieben hat, nicht ausschließen, daß es a) Leerzeilen geben könnte, und b) folgende Konstellation:

    [1234]
    blag blup ble
    aahh kkll i9kdl
    kkdlii llks
    [5672]
    ...
    ...

    aber okay, der TE wird das wissen.



  • Naja, ansonsten überspringt man halt keine Zeile und sucht in jeder Zeile nach dem Schlüsselparameter.
    Oder nur in den Zeilen, die ein '[' haben.

    Da sind ja alle Möglichkeiten offen.



  • hallo zusammen,
    nochmals danke für die schnellen Antworten und Lösungen.
    Das Ziel wäre, aus der Datei die position für gewisse Parameter zu laden und die dann die neuen Parameter zu verwenden. Am schluss folgt dann der Kommentar zu den Parameter.

    z.b:

    starten mit

    "programmname" 1234 <-Parameter der übergeben wird

    - das programm öffnet die Datei und sucht den Punkt [1234]

    - als nächstes ladet es die Parameter für den nächsten Schritt.

    (Vorschau der Datei):

    [1234]
    1, 2, 4, dehfhdfihdkf,
    // 1 ist ein bestimmter punkt von 1-10,
    // 2 eine auswahl von 1-7,
    // 4 noch so ein Parameter,
    // und am schluss folgt der kommentar dazu den ich anzeigen möchte. Der Kommentar könnte auch mehrzeilig sein

    [2345]
    2, 4, 5, efjefhefuehfeihf,



  • - das programm öffnet die Datei und sucht den Punkt [1234]

    - als nächstes ladet es die Parameter für den nächsten Schritt.

    Ja, dafür hast du doch nun ein funktionierendes Beispiel bekommen.

    Das Einzige, was du noch machen mußt ist, den Parameterstring zu zerlegen und deine neuen Parameter + Kommentar extrahieren.

    Wie weit bist du denn nun damit?



  • Hey funktioniert.
    Habe noch
    if (strstr (buffer,"1234")) durch argv[1] ersetzt, nun kann ich jede Zeile laden.
    danke



  • Na, das freut doch zu hören.

    Gruß,
    DC


Anmelden zum Antworten