Obtener extensión de archivo en C

3 minutos de lectura

avatar de usuario
manejador de errores

¿Cómo se obtiene una extensión de archivo (como .tiff) de un nombre de archivo en C?

¡Gracias!

  • Posible duplicado de Obtener extensión de archivo en lenguaje C

    – nibot

    04/03/2017 a las 18:15

avatar de usuario
ladrónmaestro

const char *get_filename_ext(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if(!dot || dot == filename) return "";
    return dot + 1;
}

printf("%s\n", get_filename_ext("test.tiff"));
printf("%s\n", get_filename_ext("test.blah.tiff"));
printf("%s\n", get_filename_ext("test."));
printf("%s\n", get_filename_ext("test"));
printf("%s\n", get_filename_ext("..."));

  • Después dot = strrchr(filename, '.');, dot != NULL implica que *dot == '.' por lo que su prueba debe ser simplemente if(dot).

    – Chris Lutz

    15 de marzo de 2011 a las 9:07


  • Estoy recibiendo un error: renamer.c:11: warning: incompatible implicit declaration of built-in function ‘strrchr’

    – manejador de errores

    15 de marzo de 2011 a las 9:08

  • Para la mayoría de los propósitos prácticos, si el último punto es el primer carácter del nombre base, entonces no debe tratarse como una extensión de archivo. por ejemplo en ~/.forward“.forward” no es una extensión.

    –Steve Jessop

    15 de marzo de 2011 a las 10:00

  • Eso realmente no importa … porque solo lo estoy usando para cambiar el nombre de mis fotos por lotes.

    – manejador de errores

    16 de marzo de 2011 a las 4:30

  • Una vez que haya extraído la extensión del archivo, un apéndice útil podría ser el strcmp() rutina de string.h. Le permitirá comparar la extensión del archivo con una cadena determinada y realizar una determinada acción, por ejemplo if (strcmp(ext,"tiff") == 0) ...

    – mabalenk

    11 de septiembre de 2019 a las 8:18

avatar de usuario
pmg

Encuentra el último punto con strrchrluego avance 1 carácter

#include <stdio.h> /* printf */
#include <string.h> /* strrchr */

ext = strrchr(filename, '.');
if (!ext) {
    /* no extension */
} else {
    printf("extension is %s\n", ext + 1);
}

  • No hay necesidad de copiarlo: devolverá una parte de la cadena que termina con el final de la cadena original, por lo que no es necesario realizar modificaciones.

    – ThiefMaster

    15 de marzo de 2011 a las 9:11

avatar de usuario
templatetypedef

Puedes usar el strrchr función, que busca la última aparición de un carácter en una cadena, para encontrar el punto final. A partir de ahí, puede leer el resto de la cadena como la extensión.

Aquí hay una versión que también funciona para archivos (o directorios) caminos:

#include <assert.h>
#include <string.h>

const char *FileSuffix(const char path[])
{
    const char *result;
    int i, n;

    assert(path != NULL);
    n = strlen(path);
    i = n - 1;
    while ((i >= 0) && (path[i] != '.') && (path[i] != "https://stackoverflow.com/") & (path[i] != '\\')) {
        i--;
    }
    if ((i > 0) && (path[i] == '.') && (path[i - 1] != "https://stackoverflow.com/") && (path[i - 1] != '\\')) {
        result = path + i;
    } else {
        result = path + n;
    }
    return result;
}


int main(void)
{
    assert(strcmp(FileSuffix("foo/bar.baz.qux"), ".qux") == 0);
    assert(strcmp(FileSuffix("foo.bar.baz/qux"), "") == 0);
    return 0;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad