main FILE in out char files 10 15 t1 txt t2 txt t3 txt t4 txt t5 txt t

  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
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
main()
{
FILE *in[5], *out[5];
char files [10][15] ={"t1.txt", "t2.txt", "t3.txt", "t4.txt","t5.txt", "t6.txt", "t7.txt", "t8.txt","t9.txt", "t10.txt"};
int number [10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i, k, ks, n[5], flag[5], flags, a, minn;
// 1-e razdelenie
in[0] = fopen("int1.txt","r");
flags = !in[0];
for (i=0; i<5; i++)
{
out[i] = fopen(files[i+5],"w"); // fopen в случае успеха вернет указатель. в случае не успеха- NULL
flags += !out[i];
}
if (flags)
{
perror ("Error open file");
getch();
return 1;
}
ks=0; k=0;
fscanf (in[0], "%d", &n[1]);
while (!feof(in[0]))
{
fprintf (out[k], "%d ", n[1]);
while (fscanf (in[0], "%d", &n[0]) != EOF && n[0]>=n[1])
{
fprintf (out[k], "%d ", n[0]);
n[1] = n[0];
}
n[1] = n[0];
ks++;
k = (k+1)%5; // цикличная запись в файл (карусель)
}
fclose (in[0]);
for (i=0; i<5; i++)
fclose (out[i]);
if (ks == 1)
{
printf ("File sorted");
getch();
return 0;
}
// slyanie + razdelenie
do
{
for (i=0; i<10; i++)
number[i] = (number[i] + 5) % 10;
flags = 0;
for (i=0; i<5; i++)
{
in[i] = fopen(files[number[i]],"r");
out[i] = fopen(files[number[i+5]],"w");
flags = flags || !in[i] || !out[i];
}
if (flags)
{
perror ("Error open file");
getch();
return 1;
}
k = 0; ks = 0;
flag[0] = fscanf (in[0], "%d", &n[0]) != EOF;
flags = flag[0];
a = n[0];
for (i=1; i<5; i++)
{
flag[i] = fscanf (in[i], "%d", &n[i]) != EOF;
flags += flag[i];
if (flag[i] && n[i]<a)
a = n[i]; // а- минимальное из первых чисел 5-ти файлов
}
while (flags>1)
{
for (i=0; !flag[i] ;i++); // находим первый файл, отличный от нуля (заполненый)
maxn = n[i];
for (i=i+1; i<5; i++)
if (flag[i] && maxn<n[i]) maxn = n[i];
if (maxn<a) // серия прерывается !!!!!!!!! а-последний записанный элемент в серию !!!!!!!!
{
ks++;
k = (k+1)%5;
for (i=0; !flag[i];i++);
minn = i;
for (i=i+1; i<5; i++)
if (flag[i] && n[minn]>n[i]) minn = i;
}
else // серия продолжается
{
for (i=0; !flag[i] || flag[i] && n[i]<a ;i++); // прокручиваем, ища нужный файл для записи
minn = i;
for (i=i+1; i<5; i++)
if (flag[i] && n[i]>=a && n[minn]>n[i]) minn = i; // выбираем минимальный из всех элементов больших уже записанного
}
fprintf (out[k], "%d ", n[minn]);
a = n[minn];
flag[minn] = fscanf (in[minn], "%d", &n[minn]) == 1; // переставляем курскор на сл. элемент после записанного
for (flags=i=0; i<5; i++) // пересчитывания кол-ва файлов
flags += flag[i]; // cтр 71
}
for (i=0; i<5; i++)
if (flag[i]) flags = i;
if (n[flags]<a) // серия закончилось
{
ks++;
k = (k+1)%5;
}
fprintf (out[k], "%d ", n[flags]);
while (fscanf (in[flags], "%d", &n[flags]) == 1) // забиваем на хвост и не сортируем его по сериям, запихивая в последный выходной файл
fprintf (out[k], "%d ", n[flags]);
ks++;
for (i=0; i<5; i++)
{
fclose (in[i]);
fclose (out[i]);
}
}
while (ks>1); // ks - кол-во выходных
printf ("Result file - %s\n", files[number[k+5]]);
getch();
return 0;
}