txt file einlesen



  • Mist ich werde wohl separieren müssen.
    Naja ich hab eigentlich nur dezimal Zahlen zum einlesen. Kann man da auch eine hexadez Zahl reinspeichern? Prinzipiell ja mit 0x nur wie das mit einlesen und in die var reinschreiben geht is halt ne ganz andere Sache^^.



  • Ja.



  • [fs]scanf kann auch hexadezimale Zahlen einlesen.
    %d liest dezimale Zahlen
    %x liest hexadezimal Zahlen (ohne 0x)
    %i erkennt am Präfix welches Format gewählt wurde.
    ⚠ Das Präfix 0 (Null) steht für oktale Zahlen. 010 ist dann eine Dezimal 8



  • danke, das hat mir viel geholfen.
    Ich hab noch eine letzte Frage!

    Kann man die Anzahl der Zeilen des Inputs auslesen mit einem Befehl?

    lg



  • Nein.



  • Ich bin jz gerade dabei das Einlesen der Zeilen zu versuchen, aber irgendwas klappt hier nicht so ganz.

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
      FILE *f;
      char file_name[100];
      char daten[200];
    
      int count = 0;
    
      printf("Welche datei wollen sie einlesen?");
      scanf("%s", file_name);
      f = fopen(file_name,"r");
    
      if (f == NULL)
      {
        printf("Konnte %s nicht oeffnen\n", file_name);
        return 0;
      }
    
      while (fgets(daten, sizeof(daten), f) != 0)
    
      for (count = 0; daten[count] != 'EOF'; count++)
        printf("%c",  daten[count]);
    
      return 0;
    }
    

    Ich hatte zuerst bei der for-Schleife daten[count] != 0 aber da ich ja zeilenweise einlesen will klappt das nicht so ganz.
    Ich dachte mir ja sowieso, dass fgets Zeile für Zeile macht aber anscheinend scheint das nicht so zu sein. Kann man evtl über den File *f; Zeiger die nächste Zeile fürs fgets aufrufen ?

    Sorry, dass ich so nervig bin, aber ich hab halt gerade zum ersten Mal weils ein Nebenfach ist und ich komm damit einfach so garnicht klar weil in der VO die Befehle einfach nur vorgelesen werden.

    Lg



  • while (fgets(daten, sizeof(daten), f) != NULL)
      fputs(daten, stdout);  // fputs hängt nicht automatisch ein '\n' an
    


  • Mir gehts hier nicht zwingend um die Ausgabe, diese ist nur da um zu überprüfen ob auch wirklich nur die erste Zeile eingelesen wird.

    Mein Problem ist es, dass ich je nach Zeile verschiedene Variablen auswerten muss und diese als int/unsigned int/hexadezimale Zahl speichern muss.
    Wenn in einer Zeile eine Falscheingabe ist muss ich auch diese Zeile in welcher die Falscheingabe war ausgeben, also muss ich soweit ichs beurteilen kann die Zeilen seperat in ein Array einlesen, danach schauen in welche "Variablen-Zuweis-Fkt." ich rein muss und danach erst diese Variablen zuweißen.

    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?

    Lg



  • richard92 schrieb:

    ...
    Wenn in einer Zeile eine Falscheingabe ist muss ich auch diese Zeile in welcher die Falscheingabe war ausgeben, also muss ich soweit ichs beurteilen kann die Zeilen seperat in ein Array einlesen, ...

    Die Funktion fgets liest deine Zeile komplett in ein Array ein, wenn das Array groß genug ist. Die Auswertung kannst du also sofort nach fgets starten.
    Die Ausgabe einer Falschzeile inklusive Zeilennummer kann dann auch sofort nach der Auswertung erfolgen, wenn du deiner Einlesefunktion einen Zähler spendierst, der die eingelesenen Zeilen zählt. Damit ist dein Problem gelöst.
    Wenn du die (Falsch)Zeilen für spätere Ausgaben, Auswertungen, etc. brauchst,
    kannst du:

    - Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**).
    - Die Zeilen in einer anderen (temporären) Datei speichern(tmpfile, tmpnam, fopen).
    - Die Positionen der Zeilenanfänge per ftell in einem Array speichern( dynamisch, long int*).



  • 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.



  • 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.


Anmelden zum Antworten