- 음악과 나 -/『 짬 통 』

midi(미디)파일을 구조체로 ......

noon2dy 2006. 5. 18. 01:11

 

2004-04-23 오후 9:58:18   /  번호: 435217  / 평점:  (-) category: VC++ 일반  /  조회: 136 
 [질문]midi(미디)파일을 구조체로 읽어서 여러번 반복하는 파일생성(C언어) 박기원 / webjjang80a  
박기원님께 메시지 보내기  박기원님을 내 주소록에 추가합니다.  박기원님의 블로그가 없습니다  

 midi(미디)파일을 구조체로 읽어서 여러번 반복하는 파일을 생성하는 프로그램을 C로 구현하고자 합니다..

 

 

typedef struct MidiChank{

    char chank_type[4]; //쟝크 타입(header)

    unsigned long data_size; //Data길이 (header)

    unsignedshort format;  //Format (header)

    unsignedshort track_num;  //트랙 수(header)

    unsignedshort time_base;  //시간단위(header)

    char track_chank_type[4];  //쟝크 타입(track)

    unsignedlong track_data_size; //Data길이(track)

}midichank;

이렇게 구조체를 정의하고 파일을 읽어서 data구분을 2배로 만들어서 2번 반복하는 파일을 만들고자 합니다.

그런데,, 이상한게 track_data_size가 4,278,215,168이라는 엄청난 숫자가 나오네요,, unsigned long타입의 최고가

4,294,967,295인데,,

아래는 제가 짜고있는 프로그램입니다..

짜는 중에 올리는거라 지분합니다,,ㅠ.ㅠ

고수님들 좋은 가르침 부탁드립니다,,ㅠ.ㅠ

 

 

 

#include <stdio.h>

#include <stdlib.h>

#include <memory.h>     //memcpy()

#include <string.h>     //strlen()

 

#define SIZE 1

 

typedef struct MidiChank{

    char chank_type[4];

    long data_size;

    short format;

    short track_num;

    short time_base;

    char track_chank_type[4];

    long track_data_size;

}midichank;

 

FILE *fp;

FILE *out_fp;

char c;

char filename[40];

char *data;

unsigned long size, i;

midichank chank;

void open()

{

    while(1)

    {

        printf("불러올 파일명을 적고 엔터를 눌러주세요..\n파일명(Load) : ");

        gets(filename);

 

        if((fp = fopen(filename, "rb")) == NULL)

        {

            fprintf(stderr, "파일을 열지 못했습니다.\n");

            continue;

        }

 

        fread(&chank, sizeof(chank), 1, fp);

        data = (char*)malloc(chank.track_data_size);

 

        i = 0;

        while(!feof(fp))

        {

            c = fgetc(fp);

            data[i] = c;

            i++;

        }

 

        

        break;

    }

    fclose(fp);

}

 

void disp()

{

    printf("[%s]의 정보...\n", filename);

    printf("[Header]chank_type = %s\n", chank.chank_type);

    printf("[Header]data_size = %lu\n", chank.data_size);

    printf("[Header]format = %u\n", chank.format);

    printf("[Header]track_num = %u\n", chank.time_base);

    printf("[Header]time_base = %u\n", chank.track_num);

    printf("[Track]chark_type = %s\n", chank.track_chank_type);

    printf("[Track]data_size = %lu\n", chank.track_data_size);

    printf("data = %s\n", &data);

}

 

void save()

{

    printf("저장하실 파일명을 적고 엔터를 눌러주세요..\n파일명(Save) : ");

    gets(filename);

 

    if((out_fp = fopen(filename, "wb")) == NULL)

    {

        fprintf(stderr, "파일을 열지 못했습니다.\n");

        exit(1);

    }

    fwrite(&chank, sizeof(chank), 1, out_fp);

    fputs(data, out_fp);

    printf("[%s]파일로 저장하였습니다.\n", filename);

 

}

/*

void size_save()

{

    int num, i;

    char *imsi;

    

    printf("저장하실 파일명을 적고 엔터를 눌러주세요..\n파일명(Save) : ");

    gets(filename);

 

    printf("반복횟수 : ");

    scanf("%d", &num);

    //imsi = (char*)malloc(sizeof(chank.data)*num);

 

    if((fp = fopen(filename, "wb")) == NULL)

    {

        fprintf(stderr, "파일을 열지 못했습니다.");

        exit(1);

    }

    //memcpy(imsi, chank.data, strlen(chank.data));

    chank.track_data_size = chank.track_data_size * (unsigned long)num;

    printf("Test Start\n");

    memcpy(imsi, chank.data, strlen(chank.data)); //strcpy(imsi, chank.data);

    printf("Test End\n");

    for(i=0; i<num-1; i++)

    {

        strcat(imsi, chank.data);

    }

 

    memcpy(chank.data, imsi, strlen(imsi));     //Data영역에 반복된 만큼 저장

 

    fwrite((void*)&chank, sizeof(chank), 1, fp);

    printf("[%s]파일로 저장하였습니다.\n", filename);

 

}

*/

 

void main()

{

    open();     //미디데이터를 열어서 구조체에 저장

    disp();

    save();

}

이 글에 평점 주기:  

'- 음악과 나 - > 『 짬 통 』' 카테고리의 다른 글

알고리즘 강좌  (0) 2006.05.18
시리얼통신의 깊은 이해  (0) 2006.05.18
그냥 c 프로그래머가 알아야할것들  (0) 2006.05.18
비트매니아 대략.  (0) 2006.05.18
peekmessage  (0) 2006.05.18