2017-07-10 2 views
0

Wenn ich einen FILE-Zeiger an eine Funktion übergebe, wird sie aktualisiert?Übergabe eines Dateizeigers an eine Funktion

Kann ich etwas wie das Folgende tun?

FILE* fp; 
size_t read, len; 
char *key; 
fp=fopen((tmpDir+"/"+filename).c_str(),"r"); 
while((read=getline(&key,&len,fp))!=-1){ 
    if (header_section){ 
    processHeader(fp); 
    }else{ 
    processBody(fp); 
    } 
} 
fclose(fp); 

void processHeader(FILE* fp){ 
    size_t read, len; 
    char *key; 
    while((read=getline(&key,&len,fp))!=-1){ 
    ... do header processing ... 
    if(strcmp(key,"end_of_header")==0){ 
     return; 
    } 
    } 
} 
void processBody(FILE* fp){ 
    size_t read, len; 
    char *key; 
    while((read=getline(&key,&len,fp))!=-1){ 
    ... process body data ... 
    } 
} 

Der obige Code funktioniert nicht (ich bekomme einen Segmentierungsfehler). Gibt es eine Möglichkeit, Teile einer Textdatei in verschiedenen Funktionen gemäß dem Abschnitt der Datei zu verarbeiten?

+2

Verwenden Sie std :: ifstream, std :: getline und std :: string. –

+0

_If * n ist nicht Null, die Anwendung muss sicherstellen, dass * lineptr entweder auf ein Objekt mit einer Größe von mindestens * n Bytes zeigt oder ein Nullzeiger ist._ [getline] (http://pubs.opengroup.org/ onlinepubs/9699919799/functions/getdelim.html). Sie haben key und len nicht initialisiert. –

+0

der gepostete Code kompiliert nicht auf irgendeinem C++ - Compiler (der nicht "Segmentierungsfehler" genannt wird). –

Antwort

0

Ja, es ist möglich, eine FILE * an eine Funktion zu übergeben. Immerhin akzeptieren verschiedene Standard-C-I/O-Funktionen ein Argument, das ein Zeiger ist.

Jedoch ist FILE ein undurchsichtiger Typ. Ob die FILE * auf etwas zeigt (z. B. eine Datenstruktur), das aktualisiert wird, ist eine Implementierung definiert. Aber wenn Ihr Code Dinge tut, die auf einem FILE * gültig sind (z. B. Übergabe an C-I/O-Funktionen), würde das keinen Segmentierungsfehler erklären.

Der von Ihnen angegebene Teilcode reicht nicht aus, um die Ursache für Ihren "Segmentierungsfehler" zu ermitteln. Wenn das Programm abstürzt, weist Code in Ihrem Programm undefiniertes Verhalten auf. Aber der einfache Vorgang, einen FILE * zu übergeben, der als ein Rückgabewert von fopen() erhalten wird, als Argument für eine Funktion wäre nicht die Ursache. Sie müssen sich anderen Code in Ihrem Programm ansehen.

Und in C++ wäre es besser, C++ - Streams als C-I/O-Funktionen zu verwenden. Aber das ändert höchstens das Symptom. Wenn ein anderer Code die Ursache für Ihr undefiniertes Verhalten ist, wird das Ändern der E/A-Methode (vorausgesetzt, Sie tun es richtig) das nicht beheben.

+0

Danke, Peter. Solange die Position des Dateizeigers korrekt aktualisiert wird, wenn die Funktion zurückkehrt, denke ich, dass meine Frage beantwortet wird. Ich habe meinen Code übersprungen und die Segmentierungsfehler scheinen nichts mit dem Code zu tun, den ich gepostet habe. –

Verwandte Themen