50219. Concatenate Two Wave Files

難度:3/5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <stdlib.h>
#include <stdint.h>

char in_name_1[128], in_name_2[128], out_name[128];
FILE *in_1, *in_2, *out;

void copy_file(FILE* in, FILE* out){
fseek(in, 0, SEEK_SET); fseek(out, 0, SEEK_SET);
uint8_t arr[4096]; int cnt;
while(cnt = fread(arr, sizeof(uint8_t), 4096, in)){
fwrite(arr, sizeof(uint8_t), cnt, out);
}

}
uint32_t find_chunk_size(FILE* in){
fseek(in, 4, SEEK_SET);
uint32_t n;
fread(&n, sizeof(uint32_t), 1, in);
return n;
}
uint32_t find_subchunk_size(FILE* in){
fseek(in, 40, SEEK_SET);
uint32_t n;
fread(&n, sizeof(uint32_t), 1, in);
return n;
}

void mod_chunk_size(FILE* out, uint32_t n){
fseek(out, 4, SEEK_SET);
fwrite(&n, sizeof(uint32_t), 1, out);
return;
}
void mod_subchunk_size(FILE* out, uint32_t n){
fseek(out, 40, SEEK_SET);
fwrite(&n, sizeof(uint32_t), 1, out);
return;
}

void file_concat(FILE* in, FILE* out){
fseek(in, 44, SEEK_SET); fseek(out, 0, SEEK_END);
uint8_t arr[4096]; int cnt;
while(cnt = fread(arr, sizeof(uint8_t), 4096, in)){
fwrite(arr, sizeof(uint8_t), cnt, out);
}
}

int main(){
scanf("%s %s %s", in_name_1, in_name_2, out_name);
in_1 = fopen(in_name_1, "rb");
in_2 = fopen(in_name_2, "rb");
out = fopen(out_name, "wb");

copy_file(in_1, out);
uint32_t ck_1 = find_chunk_size(in_1);
uint32_t ck_2 = find_chunk_size(in_2);
uint32_t sck_1 = find_subchunk_size(in_1);
uint32_t sck_2 = find_subchunk_size(in_2);

mod_chunk_size(out, ck_1 + ck_2 - 36);
mod_subchunk_size(out, sck_1 + sck_2);
file_concat(in_2, out);

fclose(in_1);
fclose(in_2);
fclose(out);
}


50219. Concatenate Two Wave Files
https://aaronlin1229.github.io/judgegirl_50219/
Author
Akizumi
Posted on
July 17, 2023
Licensed under