2017-02-05 2 views
0

Ich versuche eine Funktion zu schreiben, die bei bestimmten Textdateien bestimmte Zeilen zurückgibt. Aber das Problem ist, einige von ihnen sind nicht gedruckt.Mit fgets und mit printf werden nur einige Zeilen gedruckt

Ich benutze fgets (var, 1500, (Datei *) fp), um jede Zeile aus einer Datei zu bekommen, und dann drucke ich es mit printf.

Der Inhalt der Dateien ist wie folgt:

zu: Mark

Von: Bob

ID: 0

Sun Feb 5 13:21:38 2017

Betreff: Fußball

Text: Am nächsten Samstagmorgen

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

void listmails(){ 


char To[300]; 
char From[300]; 
char Date[1500]; 
char Subject[300]; 
char ID[300]; 
char Text[300]; 
char llegible[500]; 
int countkong = 0; 

    FILE *fp; 


while (countkong != -1){ 
sprintf(llegible, "%d_EDA1_email.txt", countkong); // files name are of the type 0_EDA1_email.txt, 1_EDA1_email.txt... 

fp = fopen(llegible, "r"); 
countkong ++; 
if(fp!=NULL){ 



     fgets(To, 300, (FILE*)fp); // I don't want to do nothing wit this line, only to jump to the next line of the file 

     fgets(From, 300, (FILE*)fp); 
     printf("%s\n", From); 
     fgets(ID, 300, (FILE*)fp); 
     printf("%s\n", ID); 
     fgets(Date, 1500, (FILE*)fp); 
     fgets(Subject, 300, (FILE*)fp); 
     printf("%s\n", Subject); 

     } 

    } 

} 


int main() 
{ 

listmails(); 
return 0; 

} 

this is what I get

+2

Bitte fügen Sie ein komplettes und kompilierbares Code-Segment ein und formatieren Sie es zur besseren Lesbarkeit. Für den Anfang müssen Sie nicht 'fp' in den Argumentlisten tippen. 'fgets (From, 300, fp);' funktioniert einwandfrei, solange 'fp' nach dem Aufruf von' fopen(); 'existiert (was Sie nicht verifiziert haben). Und schließlich sollte der Link zu Ihren Ergebnissen durch eine einfache Textbeschreibung unter Ihrem Code-Segment ersetzt werden. – ryyker

+0

Bitte geben Sie die Textausgabe in Ihre Frage als Text ein (Code - einrücken). Verknüpfen Sie keine Bilder. –

Antwort

2

Wenn Ihre Eingabedatei Darstellung richtig ist, dann haben Sie über 11 oder 12 Linien, teilweise mit sichtbarem Text, andere mit nur Leerzeichen, wahrscheinlich eine neue Zeile (\n)

fgets():

Die Funktion C Bibliothek char * fgets (char * str, int n, FILE * stream) 012.liest eine Zeile aus dem angegebenen Stream und speichert sie in der Zeichenfolge string . Es stoppt, wenn entweder (n-1) Zeichen gelesen werden, dasNewline-Zeichen gelesen wird oder das Dateiende erreicht wird, je nachdem, welches zuerst kommt.
...
Bei Erfolg gibt die Funktion den gleichen str-Parameter zurück. Wenn das Dateiende angetroffen wird und keine Zeichen gelesen wurden, bleibt der Inhalt von unverändert und ein Nullzeiger wird zurückgegeben.

Wie geschrieben, Ihr Code scheint ein paar Dinge in Ordnung zu lesen, nur nicht das, was Sie denken, es ist das Lesen:

fgets(From, 300, (FILE*)fp); //reads "To: Mark" 
    printf("%s\n", From); 
    fgets(ID, 300, (FILE*)fp); //reads "\n" 
    printf("%s\n", ID); 

Und so weiter.

Aber aus der Anzeige Ihrer Ergebnisse bin ich nicht sicher, was Sie in Ihrem Code-Segment enthalten haben, ist tatsächlich, was Sie kompiliert haben.

Um, Experiment mit einem Schleifenkonstrukt verbessern Sie Ihre Datei zu lesen:

enum {//list all known elements of your file 
    to, 
    from, 
    date, 
    subject, 
    max_lines 
} 

char header[max_lines][80]; 
char body[SOME_LARGER_NUMBER];// hardcoded size not best approach, just for illustration. 
int i = 0; 
while(fgets(header[i], 80, fp)) 
{ 
    if(strlen[header[i]) > 1) i++; //increment lines index only when string has length > 1 
} 

Sobald Sie die Header-Informationen haben, einen neuen Schleifenabschnitt starten Sie den Nachrichtentext verketten.