2011-06-19 14 views
13

Dosya taraması giriş dosyası Bir dosyadan - fopen ve ifstream - metin girişi için iki yol buldum. Aşağıda iki parçacığı vardır. Okuması gereken bir tam sayı içeren bir satırdan oluşan bir metin dosyası var. Fopen mi yoksa ifstream mi kullanmalıyım?Bir metin dosyası okuma - fopen vs. 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 - lfStream

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

cevap

13

o fopen biraz daha modüler olduğu için ifstream tercih ediyorum. Akıştan okuyan kodun ayrıca bir dize akışından veya başka herhangi bir istekten okunmasını istediğinizi varsayalım. Böyle yazabilirim:

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

Şimdi gerçek dosyayı kullanmadan stream_reader test veya diğer giriş türlerinden okumak için kullanabilirsiniz. Bu fopen ile çok daha zor.

+0

Neden stream_reader (dosya * akışı) geçersiz olmaz {fgets (satır, len, akış); koyar (hat); } 'esas olarak aynı mı? –

+0

Fopen veya tmpfile çağrılmadan 'FILE *' oluşturmak mümkün mü? Buna inanmıyorum ama yanılıyor olabilirim. "Stream_reader" işlemi yalnızca bir dosya değil, bir akış gerektirdiğinden, bir dosyaya "FILE *" gereksinimi duyarak bunu aşmayı tercih etmemekteyim. Ünite testlerinde, örneğin bir 'FILE *' yerine dize akışını iletmek daha kolay olabilir. –

+0

Evet, bu perspektiften, C versiyonu daha sıkı bir şekilde kısıtlanmıştır - en azından standartta bir dosyadan ziyade bir dizgeye karşılık gelen 'FILE *' için herhangi bir hüküm yoktur (bazı kütüphaneler En azından dahili olarak, biraz zaman). Bundan * gerçekten * kaçınmanız gerekiyorsa, bir işaretçiyi yazmayı yapmak için bir işleve aktarabilirsiniz, ancak kesinlikle daha sessizdir. –

25

Bu C++ olarak etiketlendiği için, ifstream diyeceğim. C olarak etiketlendiyse, fopen ile giderdim: P

+2

C arayüzünün dosyaları okumak için daha temiz olduğunu düşünüyorum ama yine de +1. –