-1

私はプログラミングの初心者で、ID3V2 形式の mp3 ファイルを読み取るための C 言語のコードを書くという大学からの割り当てを受けています。私はウェブを検索し、いくつかのピースをまとめようとしましたが、このコードを思いつきました。上から下まで多くのエラー警告を配置しましたが、どこが間違っているのかまだわかりません。

私の最初の問題は、コードが 1 つの警告だけでコンパイルされることです。

残念ながら、ここで何が私の間違いなのかわかりません。間違いがあった場合にユーザーの入力を印刷しようとしていますが、これを行うとこの警告が表示されます。

私の 2 番目の問題は、出力として取得したコードを実行しているときです。プログラムはタグを取得できませんでした。

どんな助けでも大歓迎です。

私の問題をお読みいただきありがとうございます。

よろしく、サノス

これまでの私のコードは次のとおりです。

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

    typedef struct{
    char tag[3];
    char title[30];
    char artist[30];
    char album[30];
    char year[4];
    char comment[30];
    unsigned char genre;
    }mp3Info;

    int main (int argc, char *argv[])
    {
    if ( argc != 1 ) /* Input from user argc should be 1 for correct
    *execution. The argument count variable
    * stores the number of arguments plus one. */ 
    {
    /*We print argv[0], if the program that user has chosen for
     * execution it is not correct as input if has more inputs*/ 
    printf( "Please choose one file: %s <silence.mp3> \n", argv[0] );
    }
    else 
    {
    FILE *file; /* A file pointer is a variable of type FILE, 
    * we declare a file pointer.*/

    file = fopen("silence.mp3", "rb"); /* Open the file
    * silence.mp3 in
    * "reading" mode "r". */

    if (file == NULL) {
    /* If the file could not open for a variety of reasons
     * the program should inform us by print the document
     * and exit.*/ 
    printf("I couldn't open: %s for reading.\n");
    exit(0);
    }

    else 
    {
    mp3Info tag_in;

    /* Set the fseek to the beggining of the document with
     * the help of the command SEEK_SET, condition if fail*/

    if (fseek(file, 0 *sizeof(mp3Info), SEEK_SET) == -1)
    {
    fprintf(stderr, "Not able to fseek");
    return EXIT_FAILURE;
    }

    /* Read the first name "tag" */
    if (fread(&tag_in, sizeof(mp3Info), 1, file) != 1)
    {
    printf("Could not read the tag\n");
    exit (0);
    }

    /* Compare memory areas for verification */

    if (memcmp(tag_in.tag, "TAG", 3) == 0)
    {
    /* Verify that names are where as we expect */
    printf("Title: %.30s\n", tag_in.title);
    printf("Artist: %.30s\n", tag_in.artist);
    printf("Album: %.30s\n", tag_in.album);
    printf("Year: %.4s\n", tag_in.year);

    if (tag_in.comment[28] == '\0')

    {
    printf("Comment: %.28s\n", tag_in.comment);
    printf("Track: %d\n", tag_in.comment[29]);
    }

    else
    {
    printf("Comment: %.30s\n", tag_in.comment);
    }
    printf("Genre: %d\n", tag_in.genre);
    }

    else
    {
    fprintf(stderr, "The program has failed to get the Tags\n");
    return EXIT_FAILURE;
    }

    fclose(file);
    return 0;

    }
    }
    }
4

1 に答える 1

1

表示されている警告は、次の行に関するものです (エラー メッセージから省略した行番号から判断できます)。

printf("I couldn't open: %s for reading.\n");

%s文字列が引数として渡されることを指定していますが、約束した文字列を渡していません。

あなたのプログラムの失敗は、あなたが与えているファイルがあなたが期待する場所に ID3 タグを持っていないことを示唆しています。これは、読み取ろうとしている ID3v1 タグ (ID3v2 ではなく、まったく異なる形式です) が通常、ファイルの先頭ではなく末尾にあるためです。それを読み取るには、ファイルの先頭ではなく、末尾近くまでシークする必要があります。

fseek(file, -sizeof(mp3Info), SEEK_END);
于 2013-02-06T02:29:35.640 に答える