2011-06-19 39 views
13

ファイルの読み込みファイルの読み込みには、fopenとifstreamの2通りの方法があります。以下は2つのスニペットです。私は読み込む必要がある整数の1行からなるテキストファイルを持っています。私はfopenまたはifstreamを使うべきですか?テキストファイルの読み込み - fopenとifstream

SNIPPET 1 - FOPEN

FILE * pFile = fopen ("myfile.txt" , "r"); 
char mystring [100]; 
if (pFile == NULL) 
{ 
    perror ("Error opening file"); 
} 
else 
{ 
    fgets (mystring , 100 , pFile); 
    puts (mystring); 
    fclose (pFile); 
} 

SNIPPET 2 - はifstream

string line; 
ifstream myfile ("example.txt"); 
if (myfile.is_open()) 
{ 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     cout << line << endl; 
    } 
    myfile.close(); 
} 
else 
{ 
    cout << "Unable to open file"; 
} 

答えて

13

それはもう少しモジュラーfopenを超えていたので、私ははifstreamを好むだろう。ストリームから読み込んだコードが文字列ストリームまたは他のistreamからも読み込まれるようにしたいとします。

void file_reader() 
{ 
    string line; 
    ifstream myfile ("example.txt"); 
    if (myfile.is_open()) 
    { 
     while (myfile.good()) 
     { 
      stream_reader(myfile); 
     } 
     myfile.close(); 
    } 
    else 
    { 
     cout << "Unable to open file"; 
    } 
} 

void stream_reader(istream& stream) 
{ 
    getline (stream,line); 
    cout << line << endl; 
} 

今、あなたは本当のファイルを使用せずにstream_readerをテスト、またはその他の入力タイプから読み取るためにそれを使用することができます:あなたはこのようにそれを書くことができます。これはfopenでははるかに困難です。

+0

なぜ 'void stream_reader(FILE * stream){fgets(line、len、stream); puts(行); } '本質的に同じですか? –

+0

fopenやtmpfileを使わずに 'FILE *'を作ることはできますか?私はそれが信じられないが、私は間違っているかもしれない。 'stream_reader'の操作はファイルではなくストリームを必要とするだけなので、' FILE * 'を必要とすることでそれを過剰に歪ませることはありません。ユニットテストでは、 'FILE * 'の代わりに文字列を渡す方が簡単かもしれません。 –

+0

はい、そのような観点から、Cバージョンはより緊密に制約されています。少なくとも、標準でファイルではなく文字列を参照する 'FILE * 'の規定はありません(いくつかのライブラリは、少なくとも内部的に、かなりの時間)。あなたが本当にそれを避ける必要があるなら、関数へのポインタを渡して書くことができますが、間違いなく不器用です。 –

25

これはC++としてタグ付けされているので、私はifstreamと言うでしょう。 Cとしてタグ付けされていれば、私はfopenに行きます:P

+2

私はCインターフェースがファイルを読むのはきれいだと思いますが、とにかく+1します。 –

関連する問題