<?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[Wie den Dateityp bestimmen?]]></title><description><![CDATA[<p>Hallo!</p>
<p>ich habe eine Interfaceklasse:</p>
<pre><code class="language-cpp">class File {

public: 
virtual bool Open(const std::string&amp; pathToFile) = 0;
};
</code></pre>
<p>Davon erben jetzt meinetwegen FileCSV, FileAvi, FileXML usw. und implementieren die Open-Methode entsprechend. Jetzt wählt der Benutzer eine Datei auf der Festplatte aus, wie würde ich am elegantesten den Typ der Datei bestimmen, ohne dass der Benutzer etwas dafür machen muss. Nur die Endung anschauen finde ich schlecht.</p>
<p>Meine Idee war sowas:</p>
<pre><code class="language-cpp">File *pFile = new FileCSV();

if(!pFile-&gt;Open(pathToFile)) {
     delete pFile;
     pFile = new FileAvi();

     if(!pFile-&gt;Open(pathToFile)) {
     // usw
</code></pre>
<p>Wie macht man sowas normalerweise?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271754/wie-den-dateityp-bestimmen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 06:26:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271754.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Aug 2010 11:39:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 11:39:07 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>ich habe eine Interfaceklasse:</p>
<pre><code class="language-cpp">class File {

public: 
virtual bool Open(const std::string&amp; pathToFile) = 0;
};
</code></pre>
<p>Davon erben jetzt meinetwegen FileCSV, FileAvi, FileXML usw. und implementieren die Open-Methode entsprechend. Jetzt wählt der Benutzer eine Datei auf der Festplatte aus, wie würde ich am elegantesten den Typ der Datei bestimmen, ohne dass der Benutzer etwas dafür machen muss. Nur die Endung anschauen finde ich schlecht.</p>
<p>Meine Idee war sowas:</p>
<pre><code class="language-cpp">File *pFile = new FileCSV();

if(!pFile-&gt;Open(pathToFile)) {
     delete pFile;
     pFile = new FileAvi();

     if(!pFile-&gt;Open(pathToFile)) {
     // usw
</code></pre>
<p>Wie macht man sowas normalerweise?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935561</guid><dc:creator><![CDATA[Filermaster]]></dc:creator><pubDate>Tue, 03 Aug 2010 11:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 11:52:29 GMT]]></title><description><![CDATA[<p>Eine beliebige Art von Datei auf ihren Typ analysieren? Anhand des Inhalts natürlich. Die meisten Dateitypen haben recht eindeutig identifizierbare Header. Es ist also nur eine Fleißaufgabe diese Information aus aller Welt zusammenzutragen und jeweils einzeln zu prüfen. Oder du benutzt den Code vom Unix-Kommando <code>file</code> (ist schließlich freie quelloffene Software). Oder besser du benutzt gleich <code>file</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935570</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 03 Aug 2010 11:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 11:54:19 GMT]]></title><description><![CDATA[<p>Ok, Nachtrag ;): Es soll keine beliebige Datei sein, sondern eine der 7 für die die Klasse implementiert wurde. Das kann dann auch ein Eigenformat sein. Und XML-Dateien haben z.B. auch keinen Header im eigentlichen Sinne</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935571</guid><dc:creator><![CDATA[Filermaster]]></dc:creator><pubDate>Tue, 03 Aug 2010 11:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 11:59:38 GMT]]></title><description><![CDATA[<p>Filermaster schrieb:</p>
<blockquote>
<p>Ok, Nachtrag ;): Es soll keine beliebige Datei sein, sondern eine der 7 für die die Klasse implementiert wurde. Das kann dann auch ein Eigenformat sein. Und XML-Dateien haben z.B. auch keinen Header im eigentlichen Sinne</p>
</blockquote>
<p>Trotzdem kann man als Mensch XML-Dateien ziemlich eindeutig erkennen, oder? Das bekommt ein Computer erst recht hin.</p>
<p>Aber wenn du dich nicht auf Endungen verlassen willst, dann musst du dich zwangsläufig irgendwie am Inhalt orientieren. Irgendeinen Unterschied muss es zwischen den Dateiformaten ja geben (sonst wären sie ja gleich) und wenn man diesen in Worte fassen kann, dann kann man auch eine Überprüfung programmieren. Es sei denn es handelt sich bei allem um header- und strukturlose Binärdaten, deren Interpretation rein durch den Kontext des öffnenden Programms erfolgt. In diesem Fall wärst du aufgeschmissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935578</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 03 Aug 2010 11:59:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 12:07:55 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Filermaster schrieb:</p>
<blockquote>
<p>Ok, Nachtrag ;): Es soll keine beliebige Datei sein, sondern eine der 7 für die die Klasse implementiert wurde. Das kann dann auch ein Eigenformat sein. Und XML-Dateien haben z.B. auch keinen Header im eigentlichen Sinne</p>
</blockquote>
<p>Trotzdem kann man als Mensch XML-Dateien ziemlich eindeutig erkennen, oder? Das bekommt ein Computer erst recht hin.</p>
<p>Aber wenn du dich nicht auf Endungen verlassen willst, dann musst du dich zwangsläufig irgendwie am Inhalt orientieren. Irgendeinen Unterschied muss es zwischen den Dateiformaten ja geben (sonst wären sie ja gleich) und wenn man diesen in Worte fassen kann, dann kann man auch eine Überprüfung programmieren. Es sei denn es handelt sich bei allem um header- und strukturlose Binärdaten, deren Interpretation rein durch den Kontext des öffnenden Programms erfolgt. In diesem Fall wärst du aufgeschmissen.</p>
</blockquote>
<p>Darauf zielt ja meine Frage ab. Angenommen der Benutzer will eine *.doc Datei mit meinem Programm öffnen und ich unterstütze xls, xml, avi, doc.<br />
Dann würde ich wie im Eingangspost beschrieben solange ein neues Objekt vom Typ &quot;File&quot; anlegen, bis eine der Open-Methoden &quot;true&quot; zurückliefert, also den Inhalt lesen kann.</p>
<p>Meine Frage war, ob das besser geht oder schon OK so ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935584</guid><dc:creator><![CDATA[Filermaster]]></dc:creator><pubDate>Tue, 03 Aug 2010 12:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 12:34:04 GMT]]></title><description><![CDATA[<p>Ich finds blöd.</p>
<p>Wenn du sieben Typen unterstützt, kann es dem Nutzer passieren, dass die Datei siebenmal geöffnet und analysiert werden muss. Das dauert doch nur unnötig lange. Was hast du denn gegen Dateiendungen? Über diese könntest du zumindest den ersten Kandidaten auswählen, mit dem du die Datei öffnen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935595</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 03 Aug 2010 12:34:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie den Dateityp bestimmen? on Tue, 03 Aug 2010 12:53:04 GMT]]></title><description><![CDATA[<p>Wenn es über Dateiendungen geht, kannst du ganz simpel pro File-Derivat eine Factory-Methode in einer std::map&lt;std::string, factoryMethod&gt; registrieren, wobei die Endung der key ist.<br />
Wenn es nicht über Endungen funktioniert, wäre eine akzeptable Lösung, eine globale Factory-Methode anzubieten, die das übergebene File einmalig analysiert, daraus den Typ erkennt und eine passende Instanz zurück liefert. Was nicht so schön ist, dass an einer einzigen Stelle bestimmt wird was das für ein Typ ist, und somit die Klasse das nicht selber erledigt, dafür wird die Datei nur einmal geöffnet und gelesen/analysiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935601</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 03 Aug 2010 12:53:04 GMT</pubDate></item></channel></rss>