Forum: PC-Programmierung fgets an array übergeben


von Eva (Gast)


Angehängte Dateien:

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;
}

von Karl H. (kbuchegg)


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.

von Timmo H. (masterfx)


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.

von Eva (Gast)


Angehängte Dateien:

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!

von Karl H. (kbuchegg)


Lesenswert?

Du solltest dir dringend ein C-Buch zulegen.
Stringhandling, Arrayandling, Filehandling. Das sind alles Grundlagen.
1
int main()
2
{
3
    int k,i,j,n;
4
    char daten[L_zeile]={0};
5
    char daten1[L_datei][L_zeile]={0};
6
    FILE *datei;
7
    datei=fopen("C-T-exp-Kopie.dat","r");
8
9
    if(datei!=0)
10
    {
11
        for(n=0;n<L_datei;n++)
12
        {
13
            fgets(datenl[n],50,datei);
14
        }
15
    }
16
    else
17
    {
18
        printf("Datei konnte nicht ge?et werden.\n");
19
    }
20
21
    for(k=0;k<L_datei;k++)
22
    {
23
       printf("%s",daten1[k]);
24
       printf("\n%d\n",k);
25
    }
26
    fclose(datei);
27
    return 0;
28
}

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.