<?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[Beispiel mit getopt_long(), Speichert argument nicht wenn anderes Argument ein Int anstelle eines Floats ist]]></title><description><![CDATA[<p>Ich habe ein Problem in einem Testprogramm bei dem ich Programmargumente mittels getopt_long() auswerte.</p>
<p>Das Problem betrifft die nachträgliche Speicherung eines zusätzlichen Parameters der nicht durch eine getopt-Option erfasst wird.<br />
Das konkrete Problem ist ein der Effekt das der Datentyp eines vorhergehenden Argumentes einen Einfluss darauf hat ob dieser zustäzlicher Parameter mittels eines stringstreams umgewandelt/gespeichert werden kann.</p>
<p>Hier mein Beispielcode:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;getopt.h&gt;

int main(int argc, char **argv) {
  int c, intvar;
  std::istringstream iss;
  std::string str;

  static struct option long_options[] = {
    {&quot;test&quot;, required_argument, 0, 0},
    {NULL, 0, NULL, 0}
  };
  int option_index = 0;

  while ((c= getopt_long(argc, argv, &quot;t&quot;, long_options, &amp;option_index)) != -1) {
    switch (c) {
      case 0:
        iss.str(optarg);
        iss &gt;&gt; intvar;
        break;
      default:
        std::cout&lt;&lt;&quot;default&quot;;
    }
  }
  if (optind &gt;=argc || optind &lt; (argc-1))
    std::cout&lt;&lt;&quot;more or less than one additional argument given!&quot;&lt;&lt;std::endl;
  else {
      iss.str(argv[optind]);
      iss &gt;&gt; str;
      std::cout&lt;&lt; &quot;intvar=&quot; &lt;&lt; intvar &lt;&lt; &quot;, argv[optind]=&quot;
      &lt;&lt; argv[optind] &lt;&lt; &quot;, str=&quot; &lt;&lt; str &lt;&lt; std::endl;
  }

  return 0;
}
</code></pre>
<p>Rufe ich das Programm mittels folgendem Kommando auf:<br />
./programm --test 2.0 zusatz<br />
erhalte ich diese Ausgabe:<br />
intvar=2, argv[optind]=zusatz, str=zusatz</p>
<p>wenn ich das Programm folgendermaßen aufrufe:<br />
./programm --test 2 zusatz<br />
erhalte ich die folgende Ausgabe:<br />
intvar=2, argv[optind]=zusatz, str=</p>
<p>Wie man sieht, wird das intvar Argument korrekt erfasst und gespeichert egal ob ich es als 2.0 oder als 2 angebe. Auch das zusätzliche Argument &quot;zusatz&quot; findet sich immer im letzten Eintrag des Arrays und wird auch detektiert (sonnst würde das Programm einen Fehler melden wenn optind != argc-1 wäre).</p>
<p>Aber das Speichern mittels des Stringstreams in die Stringvariable str, scheitert im Fall von: &quot;2&quot;. Das kann ich mir nicht erklären.</p>
<p>Was passiert hier?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324844/beispiel-mit-getopt_long-speichert-argument-nicht-wenn-anderes-argument-ein-int-anstelle-eines-floats-ist</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 22:00:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324844.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Apr 2014 11:00:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beispiel mit getopt_long(), Speichert argument nicht wenn anderes Argument ein Int anstelle eines Floats ist on Fri, 04 Apr 2014 11:00:27 GMT]]></title><description><![CDATA[<p>Ich habe ein Problem in einem Testprogramm bei dem ich Programmargumente mittels getopt_long() auswerte.</p>
<p>Das Problem betrifft die nachträgliche Speicherung eines zusätzlichen Parameters der nicht durch eine getopt-Option erfasst wird.<br />
Das konkrete Problem ist ein der Effekt das der Datentyp eines vorhergehenden Argumentes einen Einfluss darauf hat ob dieser zustäzlicher Parameter mittels eines stringstreams umgewandelt/gespeichert werden kann.</p>
<p>Hier mein Beispielcode:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;getopt.h&gt;

int main(int argc, char **argv) {
  int c, intvar;
  std::istringstream iss;
  std::string str;

  static struct option long_options[] = {
    {&quot;test&quot;, required_argument, 0, 0},
    {NULL, 0, NULL, 0}
  };
  int option_index = 0;

  while ((c= getopt_long(argc, argv, &quot;t&quot;, long_options, &amp;option_index)) != -1) {
    switch (c) {
      case 0:
        iss.str(optarg);
        iss &gt;&gt; intvar;
        break;
      default:
        std::cout&lt;&lt;&quot;default&quot;;
    }
  }
  if (optind &gt;=argc || optind &lt; (argc-1))
    std::cout&lt;&lt;&quot;more or less than one additional argument given!&quot;&lt;&lt;std::endl;
  else {
      iss.str(argv[optind]);
      iss &gt;&gt; str;
      std::cout&lt;&lt; &quot;intvar=&quot; &lt;&lt; intvar &lt;&lt; &quot;, argv[optind]=&quot;
      &lt;&lt; argv[optind] &lt;&lt; &quot;, str=&quot; &lt;&lt; str &lt;&lt; std::endl;
  }

  return 0;
}
</code></pre>
<p>Rufe ich das Programm mittels folgendem Kommando auf:<br />
./programm --test 2.0 zusatz<br />
erhalte ich diese Ausgabe:<br />
intvar=2, argv[optind]=zusatz, str=zusatz</p>
<p>wenn ich das Programm folgendermaßen aufrufe:<br />
./programm --test 2 zusatz<br />
erhalte ich die folgende Ausgabe:<br />
intvar=2, argv[optind]=zusatz, str=</p>
<p>Wie man sieht, wird das intvar Argument korrekt erfasst und gespeichert egal ob ich es als 2.0 oder als 2 angebe. Auch das zusätzliche Argument &quot;zusatz&quot; findet sich immer im letzten Eintrag des Arrays und wird auch detektiert (sonnst würde das Programm einen Fehler melden wenn optind != argc-1 wäre).</p>
<p>Aber das Speichern mittels des Stringstreams in die Stringvariable str, scheitert im Fall von: &quot;2&quot;. Das kann ich mir nicht erklären.</p>
<p>Was passiert hier?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392754</guid><dc:creator><![CDATA[franko]]></dc:creator><pubDate>Fri, 04 Apr 2014 11:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to Beispiel mit getopt_long(), Speichert argument nicht wenn anderes Argument ein Int anstelle eines Floats ist on Fri, 04 Apr 2014 17:54:50 GMT]]></title><description><![CDATA[<p>franko schrieb:</p>
<blockquote>
<p>Was passiert hier?</p>
</blockquote>
<p>Der stringstream erreicht eof, wenn wirklich nur ein int drin ist.<br />
Dann schlaegt das nächste lesen fehl.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;

void print_state(const std::istream&amp; in){
  if(in.good()){
    std::cout &lt;&lt; &quot;good\n&quot;;
    return;
  }
  if(in.eof())
    std::cout &lt;&lt; &quot;eof &quot;;
  if(in.fail())
    std::cout &lt;&lt; &quot;fail &quot;;
  if(in.bad())
    std::cout &lt;&lt; &quot;bad&quot;;
  std::cout &lt;&lt; '\n';
}

int main(){
  std::istringstream iss;
  //iss.str(&quot;1&quot;);  // diese oder...
  iss.str(&quot;1.0&quot;);  // ...jene Zeile auskommentieren
  int i;
  iss &gt;&gt; i;
  print_state(iss);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2392861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392861</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 04 Apr 2014 17:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to Beispiel mit getopt_long(), Speichert argument nicht wenn anderes Argument ein Int anstelle eines Floats ist on Fri, 04 Apr 2014 18:22:00 GMT]]></title><description><![CDATA[<p>Aber in meinem Fall enthällt der Stringstream doch immer das gleiche:</p>
<pre><code>iss.str(argv[optind]);
</code></pre>
<p>setzt den Stream gleichzeitig auch zurück.<br />
argv[optind] hat laut Ausgabe am Ende immer den gleichen Inhalt, in beiden Fällen! Also müsste auch der Stringstream identisch sein oder nicht?</p>
<p>Die Umwanldung<br />
iss &gt;&gt; str;</p>
<p>ist also unabhängig vom Einlesen des Int/Float Testargumentes, der Stream weiß garnichts davon, und sollte wie gesagt in beiden Fällen identisch sein.</p>
<p>edit: laut <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> solte istringstream::str(string) den vorherigen Inahlt löschen: <a href="http://www.cplusplus.com/reference/sstream/istringstream/str/" rel="nofollow">http://www.cplusplus.com/reference/sstream/istringstream/str/</a><br />
Zitat: &quot; sets str as the contents of the stream, <strong>discarding</strong> any previous contents.&quot;</p>
<p>Laut stackoverflow: <a href="http://stackoverflow.com/questions/2767298/c-repeatedly-using-istringstream" rel="nofollow">http://stackoverflow.com/questions/2767298/c-repeatedly-using-istringstream</a><br />
scheint es aber wichtig istringstream::clear() aufzurufen bevor man den stream neu &quot;befüllt&quot;, insbesondere um iostate flags zurückzusetzen. Die genau mein Problem vermutlich verursachen.<br />
Ich habe das noch nicht getestet, werde das jetzt aber direkt mal tun. Ich gehe davon aus bzw. hoffe, das mein Problem damit gelöst ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392864</guid><dc:creator><![CDATA[franko]]></dc:creator><pubDate>Fri, 04 Apr 2014 18:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to Beispiel mit getopt_long(), Speichert argument nicht wenn anderes Argument ein Int anstelle eines Floats ist on Fri, 04 Apr 2014 18:41:23 GMT]]></title><description><![CDATA[<p>Sobald der Stream ein Fehlerbit (in diesem Fall eof) gesetzt hat, gehen nachfolgende Lesevorgänge sehr wahrscheinlich in die Hose.<br />
Deswegen brauchst Du das <code>clear()</code> (oder einen frischen Stream), ja.</p>
<p>Schöner ist's allerdings gar keinen <code>stringstream</code> zu nehmen, weil es mittlerweile genügend Funktionen gibt, die die Konversion erledigen.<br />
Siehe: <a href="http://en.cppreference.com/w/cpp/string/basic_string" rel="nofollow">http://en.cppreference.com/w/cpp/string/basic_string</a> (unter Numeric conversions)</p>
<pre><code class="language-cpp">#include &lt;string&gt;

void f(){
  int i = std::stoi(&quot;1&quot;);
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2392873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392873</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 04 Apr 2014 18:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Beispiel mit getopt_long(), Speichert argument nicht wenn anderes Argument ein Int anstelle eines Floats ist on Fri, 04 Apr 2014 19:13:55 GMT]]></title><description><![CDATA[<p>Zunächst mal, mit clear funktioniert es jetzt in der Tat.<br />
Was die neuen Methoden angeht, auf die muss ich leider verzichten, meine Progamme müssen leider auf rechnern Lauffähig sein die ihren Compiler und ihr OS ganz generell nur sehr seltzen updaten (&quot;never change a running system&quot;, das gilt insbesondere für teure Großrechner die ständig von vielen Nutzer gebraucht werden). D.h. auf c++11 muss ich verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392879</guid><dc:creator><![CDATA[franko]]></dc:creator><pubDate>Fri, 04 Apr 2014 19:13:55 GMT</pubDate></item></channel></rss>