2011-06-19 15 views
13

Googling input pliku Znalazłem dwa sposoby wprowadzania tekstu z pliku - fopen i ifstream. Poniżej znajdują się dwa fragmenty. Mam plik tekstowy składający się z jednej linii z liczbą całkowitą, którą muszę przeczytać. Czy powinienem używać Fopen lub Ifstream?Czytanie pliku tekstowego - 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 - 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"; 
} 

Odpowiedz

13

wolałbym ifstream ponieważ jest to nieco więcej niż fopen modułowy. Załóżmy, że chcesz, aby kod czytający ze strumienia był również odczytywany ze strumienia napisów lub z dowolnego innego strumienia istream. Można napisać to tak:

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

Teraz można przetestować stream_reader nie używając prawdziwej plik lub używać go czytać od innych typów wejściowych. Z fopen jest to znacznie trudniejsze.

+0

Dlaczego nie 'void stream_reader (strumień FILE *) {fgets (linia, len, strumień); puts (linia); } 'być zasadniczo identyczne? –

+0

Czy można utworzyć plik 'FILE *' bez wywołania fopen lub tmpfile? Nie wierzę, że tak jest, ale mogę się mylić. Ponieważ działanie 'stream_reader' wymaga tylko strumienia, a nie pliku, wolałbym go nie przesadzić, ponieważ wymaga' FILE * '. W testach jednostkowych łatwiej jest przekazać na przykład strumień ciągów zamiast 'PLIKU *'. –

+0

Tak, z tej perspektywy wersja C jest bardziej ściśle ograniczona - nie ma przepisu na "PLIK" *, który odnosi się do ciągu znaków, a nie do pliku, przynajmniej w standardzie (chociaż niektóre biblioteki dostarczyły/wykorzystały to w przynajmniej wewnętrznie, przez jakiś czas). Jeśli * naprawdę * musisz tego uniknąć, możesz przekazać wskaźnik do funkcji do pisania, ale jest zdecydowanie bardziej niezgrabny. –

25

Ponieważ jest to oznaczone jako C++, powiem ifstream. Jeśli byłby oznaczony jako C, chciałbym iść z fopen: P

+2

Myślę, że interfejs C jest czystszy do odczytu plików, ale mimo to +1. –