2010-06-14 17 views
5

Digamos que hay un archivo llamado 12345.jpg. En C, ¿cómo puedo obtener la extensión de archivo para poder compararla con alguna extensión de archivo? Si hay alguna función incorporada, amablemente avíseme.Obteniendo la extensión de archivo en lenguaje C

+0

[SO 290488] (http://stackoverflow.com/questions/290488) cubre una gran parte del mismo terreno. –

+0

Así es esto - http://stackoverflow.com/questions/51949/how-to-get-file-extension-from-string-in-c –

+0

Posible duplicado de [Obtención de la extensión de archivo en C] (http: // stackoverflow.com/questions/5309471/getting-file-extension-in-c) – nibot

Respuesta

5

Probablemente:

#include <string.h> 

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

que le dará un puntero al período de la prórroga, o un puntero nulo si no hay ninguna extensión. Es posible que deba hacer un poco más de diligencia debida para asegurarse de que no haya un corte después del punto, entre otras cosas.

+3

'strrchr (filename + 1, '.');' manejaría nombres como '.svn' que comienzan con un punto pero no tienen extensión. – drawnonward

+0

@drawnonward: indudablemente, si considera que se trata de un nombre de archivo sin extensión, en lugar de una extensión sin nombre. Ese es otro de los casos de 'diligencia debida' a considerar. Sin embargo, si el OP está buscando comparar la extensión encontrada con una lista bastante corta de extensiones conocidas, entonces el hecho de que '.svn' no esté en la lista significa que probablemente no importará de todos modos. –

+0

@drawnonward: Leí mal lo que estaba diciendo, usted hace una observación válida. Sin embargo, eso no ayuda con las rutas absolutas que comienzan con '/', o nombres relativos que contienen una barra inclinada ('subdir/.svn'). Hay un caso para decir que necesitas encontrar el inicio del basename del archivo (después de la última barra, pero tienes que preocuparte por las barras diagonales y raíz) y luego buscar un punto que no esté en la primera posición. Supongo que eso significa que el directorio padre '..' tiene el nombre 'punto' seguido de una extensión que comienza con un punto y nada más ... Por lo general, hay otra bola curva con la que lidiar. –

-1

Uso strchr primer miembro de la matriz le dará el nombre de fichero segundo miembro de la matriz le dará extensión

+0

¿Puede profundizar en esto? –

+0

No olvides un nombre de archivo como 'this.uses.many.periods.jpg' –

8

Una función de hacer eso, junto con un instrumento de prueba:

#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; 
} 

La ejecución de este con:

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

le da:

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

+1 para' strrchr'. El mejor método para encontrar la última instancia de un personaje en una cadena. – tomlogic

+0

Por si acaso alguien lo extraña. 'getExt()' asume que 'fspec' es un nombre base, no una ruta completa. Considere por ejemplo, 'my.dir/file'. Use 'basename()' para obtener el nombre base de una ruta completa. –

2

Hay una solución CRT portátil: _splitpath.

En Windows también hay una API de shell32 no documentada llamada PathGetExtension, pero eso es malo de muchas maneras que probablemente no debería haber notado eso.

+6

Esta es obviamente una nueva definición de la palabra "portátil" de la que no estaba enterado :-) Con mis disculpas a Douglas Adams por la fama de HHGTTG. – paxdiablo

+4

De hecho, nunca he visto la palabra "portátil" y un enlace a msdn en la misma oración :-) – Job

+2

¡Mi mal, mi mal! No va a editar la respuesta, para que otros la disfruten :) –

Cuestiones relacionadas