Leí los otros artículos para encontrar la extensión de archivo de un nombre de archivo en C y los probé, pero el problema es que no funcionan correctamente.

Este es mi código :

void optionOne()
{
char filenameSrc[101],filenameDest[101];
strcpy(filenameSrc,"");
do
{
    printf("Enter source filename (*.c) : ");
    scanf("%s",filenameSrc);
}while (check_file_ext(filenameSrc) != 0);
fflush(stdout);
printf("Enter destination filename : ");
scanf("%s",&filenameDest);
char line[80];
FILE* fp = fopen("data.inp","r");
while(fgets(line,sizeof(line),fp))
{
   // do something
}
fclose(fp);
}

Y la función check_file_ext:

const char *get_file_ext(const char *filename)
{
   const char *dot = strrchr(filename, '.');
   if(!dot || dot == filename) return "";
   return dot + 1;
}
int check_file_ext(const char* filename)
{
   return strcmp(get_file_ext(filename),"c") == 0;
}

¿El problema está en el método de verificación de la extensión del archivo? ¿Podría decirme dónde está el problema en el código?

1
Jordan Borisov 29 ene. 2012 a las 12:56
Sería más fácil de responder si describiera cuál es realmente el problema.
 – 
Joachim Isaksson
29 ene. 2012 a las 13:08
Realmente no sé cuál fue el problema. Usé un archivo de encabezado con funciones definidas y las dos funciones check_file_ext y get_file_ext se declararon allí en el archivo de encabezado. Cuando los moví en el archivo c principal, el problema desapareció.
 – 
Jordan Borisov
29 ene. 2012 a las 13:11
La condición para su primer ciclo while mira hacia atrás (repite hasta que la extensión del archivo es no válida).
 – 
Dmitri
29 ene. 2012 a las 13:13

1 respuesta

La mejor respuesta

No devuelva "", devuelva un puntero al byte '\0' en su lugar:

// gcc -std=c99
#include <stdio.h>
#include <string.h>

static const char*
get_file_ext(const char *filename) {
   const char *ext = strrchr(filename, '.');
   return (ext && ext != filename) ? ext : (filename + strlen(filename));
}

int main() {
  char *files[] = {"a.c", ".a", "a", NULL };

  for (char** f = files; *f != NULL; ++f)
    printf("ext: '%s'\n", get_file_ext(*f));
}

Nota: incluye . en la extensión para mantener la coherencia.

Salida

ext: '.c'
ext: ''
ext: ''

Condición inversa: do{ ... }while(strcmp(get_file_ext(filename), ".c") != 0);

2
jfs 29 ene. 2012 a las 14:20