AnteriorPosterior

6.13. Un ejemplo de lectura y escritura: TAG de un MP3

  Curso: Fundamentos de programación en C, por Nacho Cabanes

6.13. Un ejemplo de lectura y escritura: TAG de un MP3

Los ficheros de sonido en formato MP3 pueden contener información sobre el autor, el título, etc. Si la contienen, se encontraría a 128 bytes del final del fichero. Los primeros 3 bytes de esos 128 deberían ser las letras TAG. A continuación, tendríamos otros 30 bytes que serían el título de la canción, y otros 30 bytes que serían el nombre del autor. Con esto ya podríamos crear un programa que lea esa información de un fichero MP3 (si la contiene) e incluso que la modifique.

Estos textos (título, autor y otros) deberían estar rellenos con caracteres nulos al final, pero es algo de lo que no tenemos la certeza, porque algunas aplicaciones lo rellenan con espacios (es el caso de alguna versión de WinAmp). Por eso, leeremos los datos con “fread” y añadiremos un carácter nulo al final de cada uno.

Además, haremos que el programa nos muestre la información de varios ficheros: nos pedirá un nombre, y luego otro, y así sucesivamente hasta que pulsemos Intro sin teclear nada más.

/*---------------------------*/
/*  Ejemplo en C nº 62:      */
/*  C062.C                   */
/*                           */
/*  Lectura y escritura en   */
/*  un fichero               */
/*                           */
/*  Curso de C,              */
/*    Nacho Cabanes          */
/*---------------------------*/
 
#include <stdio.h>
#include <string.h>
 
int main() {
    FILE* fich;
    char temp[31];
    int i;
 
    do {
    /* Pido el nombre del fichero */    
    printf("\nEscribe el nombre del fichero MP3 a comprobar: ");
    gets(temp);
    /* Si no teclea nada, terminaré */    
    if (strcmp(temp,"")==0) 
        puts("\nAplicacion finalizada.");
    /* Si existe nombre, intento abrir */
    else if ( (fich=fopen(temp,"r+b"))!=NULL ){
        /* Si he podido abrir, muestro el nombre */
        printf("Nombre del fichero: %s\n",temp);
        /* Miro el tamaño del fichero */
        fseek(fich,0,SEEK_END);            
        printf("Tamaño: %d\n",ftell(fich));
        /* A 128 bytes está la marca "TAG" */
        fseek(fich,-128,SEEK_END);
        fread(temp,3,1,fich);
        /* Son 3 letras, añado caracter nulo al final */
        temp[3]='\0';
        if (strcmp(temp,"TAG")!=0) 
            puts("No se encontró información válida.");
        else {
            /* Si existe la marca, leo los datos */
            /* Primero, 30 letras de titulo */
            fread(temp,30,1,fich);
            temp[strlen(temp)]='\0';
            printf("Titulo: %s\n",temp);
            /* Luego 30 letras de autor */
            fread(temp,30,1,fich);
            temp[strlen(temp)]='\0';
            printf("Artista: %s\n",temp);
            /* Ahora vamos a modificar el titulo */
            printf("\nIntroduce el nuevo titulo: ");
            gets(temp);
            /* Lo rellenamos con ceros, para seguir el estándar */
            for (i=strlen(temp); i<=29; i++)
                temp[i]='\0';               
            /* Y lo guardamos en su posición */
            fseek(fich,-125,SEEK_END);
            fwrite(&temp, 30, 1, fich);
            printf("Titulo actualizado.\n");
            fclose(fich);
            } /* Fin del "else" de MP3 con informacion */
    } /* Fin del "else" de fichero existente */
    else puts("No se pudo abrir el fichero\n");
    } /* Fin del "do..while" que repite hasta que no se escriba nombre */
    while (strcmp(temp,"")!=0);
 
    return 0;
}
 

Actualizado el: 25-07-2014 16:57

AnteriorPosterior