<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fortran-Ausgaben auf stdout abfangen]]></title><description><![CDATA[<p>Hai<br />
Ich bin mir nicht sicher ob das hier richtig ist, aber ich suche einen portablen weg, die Konsolenausgabe einer hinzugelinkten Fortran lib, die per write(<em>,</em>) erfolgt, in C++ abzufangen und in einen string umzuleiten. Ich nehme hier nur an dass es sich um das selbe stdout handelt, aber ich weiß das nicht.<br />
Daher die Frage, gibt es eine Möglichkeit das zu bewerkstelligen? Der Grund für diesen Kniff ist dass der Fortran code unverändert bleiben soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302359/fortran-ausgaben-auf-stdout-abfangen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 08:29:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302359.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Apr 2012 08:39:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fortran-Ausgaben auf stdout abfangen on Tue, 17 Apr 2012 08:39:43 GMT]]></title><description><![CDATA[<p>Hai<br />
Ich bin mir nicht sicher ob das hier richtig ist, aber ich suche einen portablen weg, die Konsolenausgabe einer hinzugelinkten Fortran lib, die per write(<em>,</em>) erfolgt, in C++ abzufangen und in einen string umzuleiten. Ich nehme hier nur an dass es sich um das selbe stdout handelt, aber ich weiß das nicht.<br />
Daher die Frage, gibt es eine Möglichkeit das zu bewerkstelligen? Der Grund für diesen Kniff ist dass der Fortran code unverändert bleiben soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202755</guid><dc:creator><![CDATA[Kontrasubjekt]]></dc:creator><pubDate>Tue, 17 Apr 2012 08:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran-Ausgaben auf stdout abfangen on Tue, 17 Apr 2012 09:37:21 GMT]]></title><description><![CDATA[<p>Hmmm...das wäre mit einer Helferapplikation einfacher (Stichwort popen bzw. _popen). Um ein paar ifdefs wirst du vermutlich nicht herumkommen, und etwas hackig wird die Angelegenheit wohl auch werden.</p>
<p>Was mir spontan einfällt, ist, eine named pipe, ein UNIX-Socket oder etwas vergleichbares aufzumachen, stdout mit freopen dahin umzuleiten und am anderen Ende der Pipe die Ausgaben in Strings zu lesen.</p>
<p>Vorstellbar wäre auch, stdout nach /dev/null bzw. NUL umzuleiten und mit setvbuf einen (großen) Buffer, der unter deiner Kontrolle steht, als Blockpuffer (_IOFBF) zwischenzuschalten. Solange dieser größer ist als die Ausgabe der Bibliothek, solltest du dann die Funktion aufrufen, ihre Ausgabe aus dem Buffer lesen und mit fflush weiter nach /dev/null schicken können. Wie zuverlässig dieser Ansatz in der Praxis ist, kann ich allerdings nicht sagen; für diesen Zweck ist setvbuf eigentlich nicht gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202781</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 17 Apr 2012 09:37:21 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran-Ausgaben auf stdout abfangen on Tue, 17 Apr 2012 10:23:52 GMT]]></title><description><![CDATA[<p>vielen Dank, ich probier die variante mit _popen mal, sieht am einfachsten aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202800</guid><dc:creator><![CDATA[Kontrasubjekt]]></dc:creator><pubDate>Tue, 17 Apr 2012 10:23:52 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran-Ausgaben auf stdout abfangen on Tue, 17 Apr 2012 10:59:18 GMT]]></title><description><![CDATA[<p>Wo ich grad drüber nachdenke, könnte man den Kindprozess auch von Hand bauen und abhören; dann ginge das auch in einer Bibliothek. In C mit POSIX sähe das etwa so aus:</p>
<pre><code class="language-cpp">#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;

void write_hello(void) {
  /* Hier könnte auch der FORTRAN-Code aufgerufen werden. */
  puts(&quot;Nein, ich bin dein Sohn!&quot;);
}

int main(void) {
  pid_t pid;
  int pipes[2];

  pipe(pipes);
  pid = fork();

  if(pid == 0) {
    /* Kindprozess */
    close(pipes[0]);
    dup2(pipes[1], STDOUT_FILENO);
    close(pipes[1]);

    write_hello();
  } else {
    /* Vaterprozess */
    char buffer[1024];
    ssize_t bytes_read;

    close(pipes[1]);
    bytes_read = read(pipes[0], buffer, 1023);
    buffer[bytes_read] = '\0';

    printf(&quot;Vaderprozess hört: %s&quot;, buffer);

    wait(NULL);
    close(pipes[0]);
  }

  return 0;
}
</code></pre>
<p>Unter Windows hast du kein POSIX, aber viele POSIX-Funktionen gibt es dort in leicht abgewandelter Form - wie etwa _popen statt popen. Mit etwas Glück lässt sich das mit endlichem Arbeitsaufwand kapseln; befrag die MSDN am besten nach _pipe, _fork, _close, _dup, _read und _wait.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202806</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 17 Apr 2012 10:59:18 GMT</pubDate></item></channel></rss>