2017-12-23 4 views
-1

Die Dokumentation besagt, dass FILE der Objekttyp ist, der einen Stream identifiziert. Also, ist es möglich, das Stream-Objekt mit einer FILE?Wie bekomme ich ein Stream-Objekt, das durch eine Datei identifiziert wurde?

Zum Beispiel würde Ich mag std::cout Objekt aus stdoutFILE Zeigern zu bekommen, oder std::cerr von stderr usw. Allgemein Ich mag eine Funktion schreiben, die einen bestimmten Strom leitet und setzen die benutzerdefinierten streambuf, um es, so etwas wie diese :

void redirect(FILE* file, std::ios stream) { 
    freopen_s((FILE**)file, "CONOUT$", "w", file); 
    stream.rdbuf(customBuffer); 
} 

verwendet Ströme umleiten

redirect(stdout, std::cout); 
redirect(stderr, std::cerr); 

Es überflüssig scheint zwei Parameter zu haben, da beide param eters sind immer miteinander verbunden.

+1

Warum nicht Dateiströme an erster Stelle verwenden? –

+0

Ich möchte, dass meine Funktion auf allen I/O-Streams läuft, nicht nur auf std :: fstream, so dass sie auch Standard-Streams umleiten kann. – krsi

Antwort

0

Während es in C++ nicht möglich ist, dies sauber zu machen, könnten Sie so etwas tun.

FILE * file = popen("someFile") 
const unsigned BUFF = 2048; 
string total; 
bool done = false; 
while (!done) { 
    vector<char> cBuf[BUFF]; 
    size_t read = fread((void *)&cBuf[0], 1, BUFF, f); 
    if (read) 
    { 
     total.append(cBuf.begin(), cBuf.end()); 
    } 
    if (read < BUFF) 
    { 
     done = true; 
    } 
} 
pclose(f); 
istringstream filey(total); 

Hoffe, das hilft.

5

Die C++ - Standardbibliothek enthält die C-Standardbibliothek. A FILE ist ein C-Stream, der ein ganz anderes Tier als ein C++ - Iostream ist. Es ist möglich, dass sich eine std::stream Implementierung auf einen zugrunde liegenden FILE stützt, aber dies wird vom Standard nicht benötigt, und selbst in diesem Fall gibt es keine Möglichkeit, sie abzurufen.

Was möglich ist, ist eine benutzerdefinierte std::streambuf erstellen, die explizit eine zugrunde liegende FILE * verwendet, und verwenden Sie sie in einem std::stream. std::basic_streambuf ist eine der wenigen Klassen aus der C++ - Standardbibliothek, die explizit als Basisklasse für die benutzerdefinierte Ableitung entworfen wurde. Leider konnte ich kein Tutorial dafür finden, aber die Klasse enthält eine Anzahl von virtuellen Methoden, die Sie einfach überschreiben müssen. Es ist nicht gerade ein einfacher Weg, aber es ist mit einigen Arbeiten, schweren Tests und eventuell etwas Hilfe von SO möglich, wenn Sie irgendwo stecken bleiben. Eine vollständige Implementierung ist jedoch weit mehr als eine SO-Antwort.

TL/DR: Es gibt keine zugrunde liegenden std::stream im Zusammenhang mit einem FILE aber mit etwas Arbeit können Sie eine benutzerdefinierte stream_buffer bauen, die eine zugrunde liegende FILE * verwenden wird. Obwohl das ziemlich fortgeschrittene Operationen sind ...

Verwandte Themen