2011-06-19 12 views
13

Nhập tệp tin Google Tôi tìm thấy hai cách để nhập văn bản từ một tập tin - fopen và ifstream. Dưới đây là hai đoạn trích. Tôi có một tập tin văn bản bao gồm một dòng với một số nguyên tôi cần phải đọc in Tôi có nên sử dụng fopen hoặc ifstream?Đọc một tập tin văn bản - fopen và ifstream

ĐOẠN 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); 
} 

ĐOẠN 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"; 
} 

Trả lời

13

Tôi muốn ifstream vì nó là mô-đun hơn một chút so với fopen. Giả sử bạn muốn mã đọc từ luồng cũng đọc từ luồng chuỗi hoặc từ bất kỳ dòng nào khác. Bạn có thể viết như sau:

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

Bây giờ bạn có thể thử stream_reader mà không cần sử dụng tệp thực hoặc sử dụng nó để đọc từ các loại đầu vào khác. Điều này là khó khăn hơn nhiều với fopen.

+0

Tại sao không 'void stream_reader (FILE * stream) {fgets (dòng, len, luồng); đặt (dòng); } 'về cơ bản giống hệt nhau? –

+0

Có thể tạo một 'FILE *' mà không cần gọi hàm fopen hoặc tmpfile không? Tôi không tin được, nhưng tôi có thể sai. Vì hoạt động của 'stream_reader' chỉ yêu cầu một luồng, chứ không phải một tệp, tôi không muốn overconstrain nó bằng cách yêu cầu nó có một' FILE * '. Trong các bài kiểm tra đơn vị, nó có thể dễ dàng hơn để truyền cho nó một luồng chuỗi thay vì một 'FILE *', ví dụ. –

+0

Có, từ quan điểm đó, phiên bản C bị ràng buộc chặt chẽ hơn - không có điều khoản cho 'FILE *' đề cập đến chuỗi thay vì tệp, ít nhất là trong tiêu chuẩn (mặc dù một số thư viện đã cung cấp/sử dụng) ít nhất là nội bộ, trong một thời gian dài). Nếu bạn * thực sự * cần phải tránh điều đó, bạn có thể chuyển một con trỏ tới một hàm để thực hiện việc viết, nhưng nó chắc chắn vụng về. –

25

Vì thẻ này được gắn thẻ là C++, tôi sẽ nói ifstream. Nếu nó được gắn thẻ là C, tôi sẽ đi với fopen: P

+2

Tôi nghĩ rằng giao diện C là sạch hơn để đọc các tập tin nhưng 1 anyway. –