2010-06-14 13 views
5

Sagen wir, es gibt eine Datei namens 12345.jpg. Wie kann ich in C die Dateierweiterung erhalten, so dass ich mit einer Dateierweiterung vergleichen kann? Wenn es eingebaute Funktionen gibt, bitte lass es mich wissen.Dateierweiterung in C Sprache erhalten

+0

[SO 290488] (http://stackoverflow.com/questions/290488) deckt eine Menge des gleichen Bodens ab. –

+0

So ist das - http://stackoverflow.com/questions/51949/how-to-get-file-extension-from-string-in-c –

+0

Mögliches Duplikat von [Dateierweiterung in C] (http: // stackoverflow.com/questions/5309471/getting-file-extension-in-c) – nibot

Antwort

5

Wahrscheinlich:

#include <string.h> 

char *extn = strrchr(filename, '.'); 

, dass Sie einen Zeiger auf den Zeitraum der Verlängerung geben, oder einen Nullzeiger, wenn es keine Erweiterung. Sie müssen unter Umständen mehr Sorgfalt walten lassen, um sicherzustellen, dass es unter anderem keinen Schrägstrich nach dem Punkt gibt.

+3

'strrchr (Dateiname + 1, '.');' würde Namen wie '.svn' behandeln, die mit einem Punkt beginnen, aber keine Erweiterung haben. – drawnonward

+0

@drainonward - zweifellos, wenn Sie dies als einen Dateinamen ohne Erweiterung, anstatt als eine Erweiterung ohne Namen betrachten. Dies ist ein weiterer Fall der "Sorgfaltspflicht", der zu berücksichtigen ist. Wenn das OP jedoch versucht, die gefundene Erweiterung mit einer ziemlich kurzen Liste bekannter Erweiterungen zu vergleichen, bedeutet die Tatsache, dass ".svn" nicht in der Liste enthalten ist, dass es wahrscheinlich sowieso keine Rolle spielt. –

+0

@drawnonward: Ich falsch gelesen, was Sie sagten - Sie machen einen gültigen Punkt. Dies würde jedoch bei absoluten Pfadnamen, die mit einem '/' beginnen, oder relativen Namen, die einen Schrägstrich ('subdir/.svn') enthalten, nicht helfen. Es gibt einen Fall, in dem Sie sagen müssen, dass Sie den Anfang des Basisnamens der Datei suchen müssen (nach dem letzten Schrägstrich, aber Sie müssen sich Gedanken über nachfolgende Schrägstriche und root machen) und dann nach einem Punkt suchen, der nicht an erster Stelle steht. Ich nehme an, das bedeutet, dass das Elternverzeichnis '..' den Namen 'Punkt' hat, gefolgt von einer Erweiterung, die mit einem Punkt beginnt, und nichts mehr ... Es gibt normalerweise einen weiteren Kurvenball. –

-1

Verwenden strchr Erstes Array Mitglied werden Sie zweites Array Mitglied Dateinamen werden Ihnen Erweiterung geben

+0

Können Sie das näher erläutern? –

+0

Vergessen Sie nicht einen Dateinamen wie 'this.uses.many.periods.jpg' –

8

Eine Funktion, das zu tun, zusammen mit einem Test-Harnisch:

#include <stdio.h> 
#include <string.h> 

const char *getExt (const char *fspec) { 
    char *e = strrchr (fspec, '.'); 
    if (e == NULL) 
     e = ""; // fast method, could also use &(fspec[strlen(fspec)]). 
    return e; 
} 

int main (int argc, char *argv[]) { 
    int i; 
    for (i = 1; i < argc; i++) { 
     printf ("[%s] - > [%s]\n", argv[i], getExt (argv[i])); 
    } 
    return 0; 
} 

Laufen dies mit:

./program abc abc. abc.1 .xyz abc.def abc.def.ghi 

gibt Ihnen:

[abc] - > [] 
[abc.] - > [.] 
[abc.1] - > [.1] 
[.xyz] - > [.xyz] 
[abc.def] - > [.def] 
[abc.def.ghi] - > [.ghi] 
+0

+1 für' strrchr'. Die beste Methode, um die letzte Instanz eines Zeichens in einer Zeichenfolge zu finden. – tomlogic

+0

Nur für den Fall, dass jemand es vermisst. 'getExt()' nimmt an, dass 'fspec' ein Basisname und nicht der vollständige Pfad ist. Betrachten Sie beispielsweise 'my.dir/file'. Verwenden Sie 'basename()', um den Basisnamen von einem vollständigen Pfad abzurufen. –

2

Es gibt eine tragbare CRT-Lösung: _splitpath.

In Windows gibt es auch eine undokumentierte Shell32-API namens PathGetExtension, aber das ist in so vielen Dingen böse, dass ich das wahrscheinlich nicht bemerkt hätte.

+6

Dies ist offensichtlich eine neue Definition des Wortes "portable", die ich vorher nicht ahnte :-) Mit Entschuldigung zu Douglas Adams von HHGTTG ​​Ruhm. – paxdiablo

+4

In der Tat, nie das Wort "portable" und eine Verbindung zu msdn im selben Satz gesehen :-) – Job

+2

Mein schlechtes, mein schlechtes! Wird die Antwort nicht bearbeiten, für andere zu genießen :) –