txt file einlesen



  • richard92 schrieb:

    Von daher müsst ich die Zeilen explizit behandeln können, nur wie geht das ist die Frage.
    Kann man sich hier vielleicht eine Variable machen welche sich merkt wo ich im txt file war, oder geht das nur seeehr viel komplizierter?

    Nicht eine Variable sondern für jede Zeile eine.

    typedef struct {char zeile[100];int ok;int wert;} Wert;
    ...
    Wert werte[1000];
    

    Und dann liest du erstmal alle Zeilen in das struct-Array und kannst dann anschließend, nachdem du die Datei wieder geschlossen hast, in aller Ruhe die Daten verarbeiten.



  • Wutz schrieb:

    CJosef schrieb:

    - Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**)

    Es gibt in C keine dynamischen Arrays, im Gegenteil, es ist gerade das entscheidende Merkmal eines Arrays, dass es bei seiner Definition eine feste Anzahl Elemente vorgegeben werden muss, die leidigen VLA mal ausgenommen, wobei die zumindest in C11 ja wenigstens nur noch optional sind und nicht mehr obligatorisch wie in C99.

    Na sicher kann ich mit malloc/calloc ein dynamisches Array erzeugen.



  • So jetzt hab ich das mit dem Struct Array so halbwegs hinbekommen.

    while (fgets(GetInput[count].line_,sizeof(GetInput[count].line_), f) != NULL)
        {
          GetInput[count].line_count_ = count + 1;
          count++;
        }
    

    Mein Problem ist, dass er hier bei jedem Leerzeichen abbricht, ich möchte es aber nur am Ende einer Zeile beenden. Ich hab es bereits mit != EOF probiert, sonst hab ich leider kp was ich hier noch änder könnte.

    LG



  • Wer er?
    fgets bricht ggü. fscanf("%s") nicht bei Leerzeichen ab. Da hast du was falsch gemacht.



  • Irgendwie hab ich da an den Compiler gedacht ;).

    ich verwende noch gar kein fscanf.

    Hier der ganze Code:

    struct _input_
      {
        char line_[100];
        int line_count_;
      } GetInput[100];
    
    int main()
    {
      FILE *f = 0;
      char file_name[7];
      int count = 0;
      int count_output_struct = 0;
    
      printf("Please enter your inputs' file path:");
      scanf("%s", file_name);
    
      f = fopen(file_name, "r");
      if (f == NULL)
      {
        printf("Invalid Filename!");
        return 0;
      }
    
      while (fgets(GetInput[count].line_,sizeof(GetInput[count].line_), f) != NULL)
        {
          GetInput[count].line_count_ = count + 1;
          count++;
        }
    
      for (count = 0; count <= 100; count++)
      {
        printf ("%c", GetInput[count_output_struct].line_[count]);
        if (count == 1)
        {
          count = 0;
          count_output_struct++;
        }
    
        if (count_output_struct == 100)
          break;
      }
      printf ("\n")
    
      return 0;
    }
    

    wobei die ausgabe nur zur Überprüfung ist was alles eingelesen wird.

    lg



  • - printf("%c") ist natürlich falsch
    - die in der while-Schleife ermittelte Anzahl der Zeilen count wirfst du bei for wieder weg
    - das andere Zeugs in for habe ich nicht verstanden und ist wohl Unsinn



  • Wutz schrieb:

    - das andere Zeugs in for habe ich nicht verstanden und ist wohl Unsinn

    Wenn man die Laufbedingung der Schleife richtig macht, braucht man das auch gar nicht:

    for (count = 0; count < 100; count++) // Nur < (kein <=)
    


  • GetInput[count].line_count_ = count + 1;
    

    hier speichere ich ja die Zeilennummer ins jewilige struct array.
    mir gehts eher darum war wenn ich einen text habe in einer txt file.

    asdf asdf
    asdf

    dann speichert er mir nur das erste asdf.

    lg



  • Schreib doch mal ein

    printf("%s", GetInput[count].line_);
    

    in deine while Schleife, dann siehst du ja ob aus der Datei alles ins Programm
    reinkommt und dann kannst du weitersuchen, wo etwas misteriöserweise verschwindet.



  • Und nimm mal eine Testdatei mit unterschiedlichen Zeichen in den Zeilen.



  • So jetzt macht mein Programm mal alles so, dass zumindest auch die richtigen Funktionen gestartet werden abhängig zur Eingabe.
    Jetzt versteh nur noch nicht so ganz wie ich mein char array [5] - [7] in eine Variable speichern sollt mit einem dezimalen bzw. hexadezimal Wert.

    lg



  • #include <stdlib.h>
    #include <stdlio.h>
    
    int d,x,i;
    char line[100] = "Hallo123";
    
    d=strtol(line+5, NULL, 10);
    x=strtol(line+5, NULL, 16);
    i=strtol(line+5, NULL, 0);
    // oder
    sscanf(line+5,"%3d", &d); // ab line[5] maximal 3 Zeichen
    sscanf(line+5,"%3x", &x);
    sscanf(line+5,"%3i", &i);
    

Anmelden zum Antworten