50249. Switch WAV File Channel
難度:4/5
34, 35行的min, max記得寫,不然他會抓到太多bytes。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#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
void rev(uint8_t arr[], int n){
uint8_t t;
for(int i = 0; i < n; i += 4){
t = arr[i]; arr[i] = arr[i + 2]; arr[i + 2] = t;
t = arr[i + 1]; arr[i + 1] = arr[i + 3]; arr[i + 3] = t;
}
}
void copy_header(FILE* in, FILE* out){
fseek(in, 0, SEEK_SET);
fseek(out, 0, SEEK_SET);
uint8_t arr[44];
fread(arr, sizeof(uint8_t), 44, in);
fwrite(arr, sizeof(uint8_t), 44, out);
}
void solve(FILE* in, FILE* out, int k){
int32_t n, data_rate;
copy_header(in, out);
fseek(in, 28, SEEK_SET); fread(&data_rate, sizeof(int32_t), 1, in);
fseek(in, 40, SEEK_SET); fread(&n, sizeof(int32_t), 1, in);
fseek(in, 44, SEEK_SET); fseek(out, 44, SEEK_SET);
int rev_n = k * data_rate, ori_n = n - rev_n;
rev_n = min(n, rev_n);
ori_n = max(0, ori_n);
uint8_t arr[8192];
while(rev_n > 0){
int now_n = min(8192, rev_n);
fread(arr, sizeof(uint8_t), now_n, in);
rev(arr, now_n);
fwrite(arr, sizeof(uint8_t), now_n, out);
rev_n -= now_n;
}
while(ori_n > 0){
int now_n = min(8192, ori_n);
fread(arr, sizeof(uint8_t), now_n, in);
fwrite(arr, sizeof(uint8_t), now_n, out);
ori_n -= now_n;
}
}
int main(){
char in_name[128], out_name[128];
int k;
scanf("%s %s %d", in_name, out_name, &k);
FILE* in = fopen(in_name, "rb");
FILE* out = fopen(out_name, "wb");
solve(in, out, k);
fclose(in);
fclose(out);
}