50179. Split a file into many files

難度:4.4/5

有幾個小問題: 1. \(N \leq 10\),所以output file的名字在第十個的時候要特別處理。 2. c = fgetc(f_in)的return value就是c。所以while(c = fgetc(f_in))會在讀到0的時候出問題。 3. 要用unsigned char讀而不是char讀。

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
#include <stdio.h>
#include <string.h>

char ip_file_name[1000];
char op_file_prefix[1000];
int n;

FILE* f_in;
FILE* f_out[100];
int p = 0;
char buffer[3000000];

int get_min_idx(int arr[]){
int min_idx = 0;
for(int i = 1; i < n; i++){
if(arr[i] < arr[min_idx]) min_idx = i;
}
return min_idx;
}

int main(){
scanf("%s", ip_file_name);
scanf("%d", &n);
scanf("%s", op_file_prefix);

f_in = fopen(ip_file_name, "rb");
int op_len = strlen(op_file_prefix);
for(int i = 0; i < n; i++){
if(i < 9){
op_file_prefix[op_len] = '0' + i + 1;
op_file_prefix[op_len + 1] = '\0';
}
else{
op_file_prefix[op_len] = '1';
op_file_prefix[op_len + 1] = '0';
op_file_prefix[op_len + 2] = '\0';
}

f_out[i] = fopen(op_file_prefix, "wb");
}

int file_size[100] = {0};
while(!feof(f_in)){
int min_idx = get_min_idx(file_size);
unsigned char c;
printf("%d started\n", min_idx);
while((!feof(f_in)) && (c = fgetc(f_in)) != EOF && (c != 255)){
printf("putting %d to %d\n", c, min_idx);
fputc(c, f_out[min_idx]);
file_size[min_idx]++;
}
printf("%d endded\n", min_idx);
}

fclose(f_in);
for(int i = 0; i < n; i++) fclose(f_out[i]);
}


50179. Split a file into many files
https://aaronlin1229.github.io/judgegirl_50179/
Author
Akizumi
Posted on
July 17, 2023
Licensed under