Á¤·ÄÀ» °øºÎÇÏ°í ÀÖ´Â ÇлýÀÔ´Ï´Ù. ¿ÜºÎÁ¤·ÄÀ̶ó´Â °É °øºÎÇÏ°í Àִµ¥, ÀÌ°Ô ¾î¶² ¿ø¸®·Î µ¹¾Æ°¡´ÂÁö µµ¹«Áö ÀÌÇØ°¡ °¡Áö ¾Ê½À´Ï´Ù.
ÀÌ°Ô ¾î¶² ¹æ½ÄÀ¸·Î µ¹¾Æ°¡´ÂÁö ¾Æ½Ã´ÂºÐ ÀÖÀ»±î¿ä? ºÎŹµå¸³´Ï´Ù
void sortData(char *filename) {
FILE *fp[4];
int i, flg1, flg2, count1, count2, val, val1, val2, n = 1;
char *file[] = { "file1.txt", "file2.txt",
"res1.txt", "res2.txt" };
while (1) {
/ Á¶°Ç - while ¹«ÇÑ·çÇÁ 1 ********************************************************************************************* /
for (i = 0; i < 4; i++) { /** °¢ ÆÄÀϵéÀÇ ¿ÀÇ ÇüÅ ¼³Á¤ ** /<br />
if (i < 2) {<br />
fp[i] = fopen(file[i], "r"); // Àб⠸ðµå·Î ¿°í,
if (fp[i]) {
if (fscanf(fp[i], "%d", &val) == EOF) // fp[i]°¡ ³¡¿¡ µµ´ÞÇÑ´Ù¸é,
goto out; // out À¸·Î À̵¿
else
rewind(fp[i]); // À§Ä¡ÁöÁ¤¿¬»êÀÚ ¸Ç ¾ÕÀ¸·Î À̵¿
}
}
else {
fp[i] = fopen(file[i], "w");
}
if (!fp[i]) { // ¿¸®Áö ¾Ê¾Ò´Ù¸é ¿¡·¯¸Þ½ÃÁö Ãâ·ÂÈÄ ÇÁ·Î±×·¥ Á¾·á
fcloseall();
printf("sortData-fopen(%s) failedn", file[i]);
exit(0);
}
}
i = 2;
flg1 = flg2 = 1;
count1 = count2 = 0;
/ Á¶°Ç - for ¹«ÇÑ·çÇÁ 1 ********************************************************************************************* /
for (;;) { // ¹«ÇÑ·çÇÁ¸¦ ÀǹÌ
if (flg1) {
/*
* file[0]°¡ ³¡¿¡ µµ´ÞÇß´Ù¸é,
* file[1]ÀÌ ³¡¿¡ µµ´ÞÇÒ¶§±îÁö file[i]¿¡ µ¥ÀÌÅ͸¦ ½á¶ó
*/
if (fscanf(fp[0], "%d", &val1) == EOF) {
while (fscanf(fp[1], "%d", &val2) != EOF) {
fprintf(fp[i], "%d ", val2);
}
break; // ±×¸®°í for¹® Å»Ãâ
}
}
if (flg2) {
/*
* file[1]°¡ ³¡¿¡ µµ´ÞÇß´Ù¸é,
* file[0]ÀÌ ³¡¿¡ µµ´ÞÇÒ¶§±îÁö file[i]¿¡ µ¥ÀÌÅ͸¦ ½á¶ó
*/
if (fscanf(fp[1], "%d", &val2) == EOF) {
while (fscanf(fp[0], "%d", &val1) != EOF) {
fprintf(fp[i], "%d ", val1);
}
break; // ±×¸®°í for¹® Å»Ãâ
}
}
/ Á¶°Ç - for ¹«ÇÑ·çÇÁ 2 ********************************************************************************************* /
/*
* file[0]¿¡¼ ÀÐÀº val1ÀÌ val2º¸´Ù Å©´Ù¸é,
* val2¸¦ Ãâ·ÂÆÄÀÏ¿¡ ¾²°í, ±×·¸Áö ¾ÊÀ¸¸é val1À» ½á¶ó
*/
if (val1 > val2) {
flg1 = 0;
flg2 = 1;
count2++;
fprintf(fp[i], "%d ", val2);
}
else {
flg1 = 1;
flg2 = 0;
count1++;
fprintf(fp[i], "%d ", val1);
}
/ Á¶°Ç - for ¹«ÇÑ·çÇÁ 3 ********************************************************************************************* /
/*
* nÀº Áõ°¡±âÀÌ´Ù. ¸¸ÀÏ count1ÀÌ n°ú °°À¸¸é Ãâ·ÂÆÄÀÏ¿¡ val2¸¦ ¾²°í, count2¸¦ Áõ°¡½ÃŲ´Ù.
* ´ÙÀ½¹Ýº¹¶§, i´Â »ç¿ëÇÏ´Â Ãâ·ÂÆÄÀÏ¿¡ µû¶ó¼ ¹Ù²ï´Ù
*/
if (count1 == n) {
fprintf(fp[i], "%d ", val2); // val2¸¦ Ãâ·ÂÆÄÀÏ¿¡ ¾²°í
count2++; // count2¸¦ Áõ°¡½ÃŲ´Ù
while (count2 < n) { // ¸¸ÀÏ count2°¡ nº¸´Ù ÀÛ´Ù¸é, Á¶°ÇÀ» °Ë»çÇÑ´Ù<br />
if (fscanf(fp[1], "%d", &val2) != EOF) // ¸¸ÀÏ file[1]ÀÌ ³¡¿¡ µµ´ÞÇÏÁö ¾Ê¾ÒÀ¸¸é,
fprintf(fp[i], "%d ", val2); // Ãâ·ÂÆÄÀÏ¿¡ val2¸¦ ½á¶ó
count2++; // ±×¸®°í count2¸¦ Áõ°¡½ÃŲ´Ù
}
flg1 = flg2 = 1; // °¢Á¾ Á¶°Çº¯¼öµé ÃʱâÈ
count1 = count2 = 0;
i = (i == 2) ? 3 : 2; // iÀÇ °ªÀ» ¹Ù²Û´Ù
}
if (count2 == n) {
fprintf(fp[i], "%d ", val1); // val1¸¦ Ãâ·ÂÆÄÀÏ¿¡ ¾²°í,
count1++; // count1 À» Áõ°¡½ÃŲ´Ù.
while (count1 < n) { // ¸¸ÀÏ count1°¡ nº¸´Ù ÀÛ´Ù¸é, Á¶°ÇÀ» °Ë»çÇÑ´Ù<br />
if (fscanf(fp[0], "%d", &val1) != EOF) // ¸¸ÀÏ file[0]ÀÌ ³¡¿¡ µµ´ÞÇÏÁö ¾Ê¾ÒÀ¸¸é,
fprintf(fp[i], "%d ", val1); // Ãâ·ÂÆÄÀÏ¿¡ val1¸¦ ½á¶ó
count1++; // ±×¸®°í count1¸¦ Áõ°¡½ÃŲ´Ù
}
flg1 = flg2 = 1; // °¢Á¾ Á¶°Çº¯¼öµé ÃʱâÈ
count1 = count2 = 0;
i = (i == 2) ? 3 : 2; // iÀÇ °ªÀ» ¹Ù²Û´Ù
}
}
/ Á¶°Ç - for ¹«ÇÑ·çÇÁ ³¡ ******************************************************************************************* /
fcloseall(); // ¸ðµçÆÄÀÏÀ» ´Ý´Â´Ù
unlink(file[0]); // file[0]À» »èÁ¦ÇÑ´Ù
unlink(file[1]); // file[1]À» »èÁ¦ÇÑ´Ù
rename(file[2], file[0]);
rename(file[3], file[1]);
n = n * 2;
}
/ Á¶°Ç - while ¹«ÇÑ·çÇÁ ³¡ ******************************************************************************************* /
out:
fcloseall(); // ¸ðµç ÆÄÀÏÀ» ´Ý´Â´Ù
unlink(filename); // filenameÀ» »èÁ¦ÇÑ´Ù
rename(file[0], filename);
unlink(file[1]); // file[1]À» »èÁ¦ÇÑ´Ù
}
/ ¿ÜºÎÁ¤·Ä ÇÔ¼ö ³¡ ******************************************************************************************* / | |
|