SORU
30 NİSAN 2010, Cuma


Nasıl POSIX dosya tanımlayıcısı c fstream oluşturmak için?

Temelde fdopen C sürümünü arıyorum(). Bu konuda biraz araştırma yaptım ve kolay olması gerektiği gibi görünüyor, ama çok karmaşık olduğu ortaya çıkıyor şeylerden biridir. Bu inanç bir şey (yani gerçekten kolay) mi kaçırdım? Oralarda da iyi bir kütüphane bir yere işlemek için bu var?

EDİT: ayrı bir cevap. örnek benim çözüm Taşındı

CEVAP
9 Mart 2011, ÇARŞAMBA


Cevap Éric Malenfant: tarafından verildi

AFAIK, bunu yapmak için bir yol yoktur standart C . Size göre bu platform, uygulama standart kütüphane olabilir teklif (olarak standart olmayan bir uzantı) fstream yapıcı bir dosya tanıtıcı alarak giriş olarak. (Bu durumda ya da bir DOSYA libstdc , IIRC)*.

Üzerinde iki farklı çalışma kodu var aşağıda gözlem ve araştırmalarıma göre yukarıda; libstdc ve Microsoft Visual C için bir tane .


libstdc

std::basic_streambuf devralır ve aşağıdaki yapıcı olan standart dışı __gnu_cxx::stdio_filebuf sınıf şablonu var

stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ)) 

açıklama ileBu associates açık POSIX dosya tanımlayıcısı ile bir dosya akışı tampon yapıcı.

POSIX ele geçirmeden biz oluşturmak (hat 1) ve daha sonra basic_streambuf olarak ıstream yapıcı (hat 2) aktarıyoruz:

#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); // 1
    istream is(&filebuf); // 2

    string line;
    getline(is, line);
    cout << "line: " << line << std::endl;
    return 0;
}

Microsoft Visual C

Standart olmayan ifstream yapıcı version POSIX dosya tanımlayıcısı almak vardı ama ikisi de current dokümanlar ve kod eksik. İfstream yapıcı DOSYASI* alarak standart olmayan başka bir sürümü var

explicit basic_ifstream(_Filet *_File)
    : _Mybase(&_Filebuffer),
        _Filebuffer(_File)
    {   // construct with specified C stream
    }

ve hatta mevcut olabilir herhangi bir eski belgeleri bulamadım) belgelenmiş değil. (Hat 1) parametre _fdopen POSIX dosya C stream DOSYASI* ele almak için arama sonucu olmak diyoruz.

#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")); // 1

    string line;
    getline(ifs, line);
    ifs.close();
    cout << "line: " << line << endl;
    return 0;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008
  • snookie77

    snookie77

    2 Mart 2006