www.mikrocontroller.net

Forum: PC-Programmierung fgets an array übergeben


Autor: Eva (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich habe ein problem mit der funktion fgets: Das Programm soll aus der 
Datei die Zeilen auslesen und in das Array daten1 reinschreiben. 
Allerdings wird in der letzten for-Schleife immer nur die letzte 
eingelesene Zeile angezeigt. Wird das nur nicht richtig angezeigt oder 
sind die Einträge wirklich falsch? Und wenn sie falsch sind, verstehe 
ich beim besten Willen nicht warum!!

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

#define Laenge_Datei (348)


int main()
{
    int k,n;
    char daten[20]={0};
    char *daten1[Laenge_Datei]={0};
    FILE *datei;
    datei=fopen("C-T-exp.dat","r");
    if(datei!=0)
    {
        for(n=0;n<Laenge_Datei;n++)
        {
            daten1[n]=fgets(daten,100,datei);
        }
    }
    else
    {
        printf("Datei konnte nicht geöffnet werden.\n");
    }
    for(k=0;k<200;k++)
    {
        printf("%s",daten1[k]);
    }
    fclose(datei);
    return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eva schrieb:

>     char *daten1[Laenge_Datei]={0};


Du hast hier ein Array von Pointern.
Aber wo ist der Speicherbereich in den deine Texte abgelegt werden?

   char daten1[Laenge_Datei][Laenge_einer_Zeile];


Du hattest Pech, dass dein Programm nicht einfach sang und klanglos 
abgeschmiert ist, dann haettest du das Problem eher bemerkt.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Rückgabewert von fgets zeigt immer auf den Buffer wo der String 
abgelegt wurde, also auf char daten[20]={0}. Logischer Weise ist das 
immer die letzte Zeile, da die Ausgabe ja nach dem ganzen Einlesen 
passiert.
Zudem solltest du auch bedenken, dass du mit fgets 100 Zeichen einliest 
und die in ein Array schreibst, das nur 20 Bytes groß ist.

Autor: Eva (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten!
Wie bekomme ich das dann hin, dass er die Zeilen in das zweidimensionale 
Array reinschreibt? Ich hab das mal ausprobiert, wie ich mir das denke, 
aber jetzt funktioniert gar nix mehr!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest dir dringend ein C-Buch zulegen.
Stringhandling, Arrayandling, Filehandling. Das sind alles Grundlagen.
int main()
{
    int k,i,j,n;
    char daten[L_zeile]={0};
    char daten1[L_datei][L_zeile]={0};
    FILE *datei;
    datei=fopen("C-T-exp-Kopie.dat","r");

    if(datei!=0)
    {
        for(n=0;n<L_datei;n++)
        {
            fgets(datenl[n],50,datei);
        }
    }
    else
    {
        printf("Datei konnte nicht ge?et werden.\n");
    }

    for(k=0;k<L_datei;k++)
    {
       printf("%s",daten1[k]);
       printf("\n%d\n",k);
    }
    fclose(datei);
    return 0;
}


Das heist nicht, das obiges Programm jetzt so wahnsinnig schlau ist. 
Das ist es nicht. Aber es korrigiert zumindest die wichtigsten Fehler im 
Stringhandling.

(PS: Merkregel - bei einem mehrdimensionalen Array läuft der letzte 
Index am schnellsten. daten1 willst du daher so anordnen, dass der erste 
Index die Zeilen sind, während der zweite Index die Character in einer 
Zeile sind.)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.