2012-05-19 13 views
17

Cách nổi tiếng của việc tạo ra một đối tượng fstream là:Tạo đối tượng fstream từ một con trỏ FILE *

ifstream fobj("myfile.txt"); 

tức. sử dụng tên tệp.

Nhưng tôi muốn tạo đối tượng ifstream bằng cách sử dụng bộ mô tả tệp.

Lý do: Tôi muốn thực hiện một lệnh sử dụng _popen()._popen() trả về kết quả dưới dạng FILE*. Vì vậy, có một con trỏ FILE * liên quan nhưng không có tên tập tin.

+1

@Joe: Posix tập tin mô tả vẫn chưa một điều. Có lẽ, cả hai C++ iostreams và C I/O đều được triển khai trên nền tảng Posix. Câu hỏi hiện tại là hợp lý hơn, mặc dù, kể cả iostreams * và * C I/O là một phần của thư viện chuẩn. –

+0

đây là bản sao của http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptor vì bạn có thể sử dụng 'fileno' trên' FILE * ' trả về từ 'popen' – Alnitak

Trả lời

3

Bạn không thể làm điều đó chỉ trong tiêu chuẩn C++, vì iostream và C I/O hoàn toàn riêng biệt và không liên quan. Tuy nhiên, bạn có thể viết riêng của mình iostream được hỗ trợ bởi luồng C FILE. Tôi tin rằng GCC đi kèm với một lớp dòng như một phần mở rộng thư viện.

Ngoài ra, nếu tất cả những gì bạn muốn là cách đối tượng để bao bọc luồng C FILE, bạn có thể use a unique pointer cho mục đích đó.

+0

Về cơ bản tôi muốn đọc đầu ra _popen() thành một chuỗi đơn. Một nghiên cứu nhỏ đã dẫn tôi đến fstream. Xin đề nghị một cái gì đó cho bối cảnh đó. –

+1

@ahmedtabrez: Chỉ cần đi với 'std :: fread' như bình thường; sử dụng bộ đệm trung gian và nối các byte bạn đọc vào chuỗi kết quả của mình. Hoặc nhìn vào những phần mở rộng GCC. –

+0

Xin vui lòng, chúng ta có thể thảo luận ở đây: http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb –

-1

Bạn có thể tạo chuỗi và sử dụng fread để đọc và nối thêm. Nó không sạch sẽ, nhưng bạn đang làm việc với một giao diện C.

Something như thế này nên làm việc:

FILE * f = popen(...) 
const unsigned N=1024; 
string total; 
while (true) { 
    vector<char> buf[N]; 
    size_t read = fread((void *)&buf[0], 1, N, f); 
    if (read) { total.append(buf.begin(), buf.end()); } 
    if (read < N) { break; } 
} 
pclose(f);