2017-07-10 16 views
0

FILEポインタを関数に渡すと、それは更新されますか?ファイルポインタを関数に渡す

私は次のようなことができますか?

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

上記のコードは機能しません(セグメンテーションフォルトが発生します)。ファイルのセクションに従って異なる機能のテキストファイルの部分を処理する方法はありますか?

+2

std :: ifstream、std :: getlineおよびstd :: stringを使用します。 –

+0

_If * nが0でない場合、アプリケーションは* lineptrが少なくとも* nバイト以上のサイズのオブジェクトを指しているか、またはヌルポインタであることを保証しなければならない。_ [getline](http://pubs.opengroup.org/ onlinepubs/9699919799/functions/getdelim.html)。キーとlenを初期化していません。 –

+0

投稿コードは、C++コンパイラではコンパイルされません(セグメンテーションフォルトと呼ばれません)。 –

答えて

0

はい、関数にFILE *を渡すことは可能です。結局のところ、さまざまな標準C入出力関数はポインタである引数を受け入れます。

ただし、FILEは不透明タイプです。 FILE *が、更新される何か(例えば、データ構造)を指し示すかどうかは、実装によって定義される。しかし、あなたのコードがFILE *で有効なものを実行している場合(例えば、それをCの入出力関数に渡す場合)、それはセグメンテーション違反を説明しません。

提供した部分コードでは、「セグメント化エラー」の原因を特定するのに十分ではありません。プログラムがクラッシュしている場合、プログラム内のコードによっては未定義の動作が発生している可能性があります。しかし、戻り値としてから得られたFILE *を引数として関数に渡すという単純な行為は原因ではありません。プログラム内の他のコードを見る必要があります。

C++では、Cの入出力ストリームよりもCの入出力ストリームを使う方が良いでしょう。しかし、たいていの場合、症状だけが変わるでしょう。他のコードが定義されていない動作の原因である場合は、I/Oの方法を変更することで、それを修正することはできません。

+0

ありがとう、ピーター。関数が返ってきたときにファイルポインタの位置が正しく更新されている限り、私は自分の質問に答えていると思います。私は自分のコードを読んできましたが、Segmentation Faultは私が投稿したコードとは無関係です。 –