50222. Truncate Wave File
難度:3.8/5
inconsistent naming跟不把data講清楚什麼用的讓這題很難,比較像在考推理能力。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#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#define min(a,b) ((a)<(b)?(a):(b))
typedef struct WAVheader {
char RIFF[4];
int chunkSize;
char wave[4];
char format[4];
int subChunkSize;
short audioFormat;
short numChannel;
int sampleRate;
int byteRate;
short blockAlign;
short bitsPerSample;
char data[4];
int dataSize;
} WAVHeader;
void truncate(FILE* in, FILE* out, int k){
WAVHeader h;
fseek(in, 0, SEEK_SET);
fread(&h, sizeof(WAVHeader), 1, in);
printf("%d %d %d %d\n", h.numChannel, h.sampleRate, h.byteRate, h.bitsPerSample);
printf("%d\n", h.dataSize);
int new_n = h.byteRate * k;
h.chunkSize = new_n + 36;
h.dataSize = new_n;
fwrite(&h, sizeof(WAVHeader), 1, out);
uint8_t arr[16384];
while(new_n > 0){
printf("%d ", new_n);
int copy_bytes = min(16384, new_n);
fread(arr, sizeof(uint8_t), copy_bytes, in);
fwrite(arr, sizeof(uint8_t), copy_bytes, out);
new_n -= copy_bytes;
}
}
int main(){
char in_name[128], out_name[128];
int k;
scanf("%s %s", in_name, out_name);
scanf("%d", &k);
FILE* in = fopen(in_name, "rb");
FILE* out = fopen(out_name, "wb");
truncate(in, out, k);
}