จากคำตอบของÉric Malenfant:
AFAIK ไม่มีวิธีทำใน C ++ มาตรฐาน ขึ้นอยู่กับแพลตฟอร์มของคุณการใช้งานไลบรารีมาตรฐานของคุณอาจเสนอ (เป็นส่วนขยายที่ไม่เป็นมาตรฐาน) ตัวสร้าง fstream ที่ใช้ตัวอธิบายไฟล์เป็นอินพุต (เป็นกรณีของ libstdc ++, IIRC) หรือ FILE *
จากการสังเกตข้างต้นและงานวิจัยของฉันด้านล่างมีรหัสการทำงานในสองรูปแบบ หนึ่งสำหรับ libstdc ++ และอีกอันสำหรับ Microsoft Visual C ++
libstdc ++
มี__gnu_cxx::stdio_filebuf
เทมเพลตคลาสที่ไม่ได้มาตรฐานซึ่งสืบทอดstd::basic_streambuf
และมีตัวสร้างต่อไปนี้
stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ))
พร้อมคำอธิบายตัวสร้างนี้เชื่อมโยงบัฟเฟอร์สตรีมไฟล์กับตัวอธิบายไฟล์ POSIX ที่เปิดอยู่
เราสร้างมันโดยผ่านจุดจับ POSIX (บรรทัดที่ 1) จากนั้นเราส่งต่อไปยังตัวสร้างของ istream เป็น basic_streambuf (บรรทัดที่ 2):
#include <ext/stdio_filebuf.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ofstream ofs("test.txt");
ofs << "Writing to a basic_ofstream object..." << endl;
ofs.close();
int posix_handle = fileno(::fopen("test.txt", "r"));
__gnu_cxx::stdio_filebuf<char> filebuf(posix_handle, std::ios::in);
istream is(&filebuf);
string line;
getline(is, line);
cout << "line: " << line << std::endl;
return 0;
}
Microsoft Visual C ++
เคยมีตัวสร้างifstream รุ่นที่ไม่ได้มาตรฐานที่ใช้ตัวบอกไฟล์ POSIX แต่ไม่มีทั้งจากเอกสารปัจจุบันและจากโค้ด มีตัวสร้าง ifstream รุ่นอื่นที่ไม่ได้มาตรฐานที่ใช้ FILE *
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{
}
และไม่ได้รับการจัดทำเป็นเอกสาร (ฉันไม่พบเอกสารเก่าที่จะนำเสนอ) เราเรียกมันว่า (บรรทัดที่ 1) โดยพารามิเตอร์เป็นผลมาจากการเรียก_fdopenเพื่อรับ C stream FILE * จากที่จับไฟล์ POSIX
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ofstream ofs("test.txt");
ofs << "Writing to a basic_ofstream object..." << endl;
ofs.close();
int posix_handle = ::_fileno(::fopen("test.txt", "r"));
ifstream ifs(::_fdopen(posix_handle, "r"));
string line;
getline(ifs, line);
ifs.close();
cout << "line: " << line << endl;
return 0;
}