luc093.c (3556B)
1 /* 2 * Author : Amit Dutta <amitdutta4255@gmail.com> 3 * Date : 08 Feb 2026 4 * Repo : https://github.com/notamitgamer/bsc 5 * License : MIT License (See the LICENSE file for details) 6 */ 7 8 /* Update Master file (Roll, Name) using Transaction file (Roll, Code Add/Delete). Both files are sorted by Roll. 9 */ 10 /* Let Us C, Chap- 19 (File Input/Output), Qn No.: B(i) */ 11 12 /* This file is auto-generated by a bot. */ 13 /* This code is not compiled; it is for reference only. */ 14 15 16 #include <stdio.h> 17 #include <stdlib.h> 18 #include <string.h> 19 #include <ctype.h> 20 21 struct student { 22 int roll; 23 char name[30]; 24 }; 25 26 struct trans { 27 int roll; 28 char code; // 'A' for Add, 'D' for Delete 29 char name[30]; // Only needed for Add 30 }; 31 32 void create_files(); 33 34 int main() 35 { 36 FILE *fm, *ft, *fn; 37 struct student m; 38 struct trans t; 39 int has_m, has_t; 40 41 create_files(); 42 43 fm = fopen("MASTER.DAT", "rb"); 44 ft = fopen("TRANS_ROLL.DAT", "rb"); 45 fn = fopen("NEW_MASTER.DAT", "wb"); 46 47 if (!fm || !ft || !fn) exit(1); 48 49 has_m = fread(&m, sizeof(struct student), 1, fm); 50 has_t = fread(&t, sizeof(struct trans), 1, ft); 51 52 printf("Merging Master and Transaction files...\n"); 53 54 while (has_m && has_t) 55 { 56 if (m.roll < t.roll) 57 { 58 // No transaction for this master record, keep it 59 fwrite(&m, sizeof(struct student), 1, fn); 60 has_m = fread(&m, sizeof(struct student), 1, fm); 61 } 62 else if (m.roll == t.roll) 63 { 64 // Transaction affects this record 65 if (t.code == 'D') 66 { 67 printf("Deleting Roll %d\n", m.roll); 68 // Skip writing 'm' to file (Deleting) 69 has_m = fread(&m, sizeof(struct student), 1, fm); 70 } 71 else 72 { 73 // Logic error: Can't ADD if ID exists. Maybe Update? 74 // Assuming replace or skip. Let's skip T and keep M for now. 75 has_m = fread(&m, sizeof(struct student), 1, fm); 76 } 77 has_t = fread(&t, sizeof(struct trans), 1, ft); 78 } 79 else // m.roll > t.roll 80 { 81 // Transaction ID is new 82 if (t.code == 'A') 83 { 84 struct student new_s; 85 new_s.roll = t.roll; 86 strcpy(new_s.name, t.name); 87 fwrite(&new_s, sizeof(struct student), 1, fn); 88 printf("Adding Roll %d\n", new_s.roll); 89 } 90 has_t = fread(&t, sizeof(struct trans), 1, ft); 91 } 92 } 93 94 // Process remaining Master 95 while (has_m) 96 { 97 fwrite(&m, sizeof(struct student), 1, fn); 98 has_m = fread(&m, sizeof(struct student), 1, fm); 99 } 100 101 // Process remaining Transactions (Only Adds) 102 while (has_t) 103 { 104 if (t.code == 'A') 105 { 106 struct student new_s = {t.roll, ""}; 107 strcpy(new_s.name, t.name); 108 fwrite(&new_s, sizeof(struct student), 1, fn); 109 printf("Adding Roll %d\n", new_s.roll); 110 } 111 has_t = fread(&t, sizeof(struct trans), 1, ft); 112 } 113 114 fclose(fm); fclose(ft); fclose(fn); 115 return 0; 116 } 117 118 void create_files() 119 { 120 struct student m[] = {{10, "A"}, {20, "B"}, {30, "C"}}; 121 struct trans t[] = {{15, 'A', "NewGuy"}, {20, 'D', ""}, {40, 'A', "LastGuy"}}; 122 123 FILE *f1 = fopen("MASTER.DAT", "wb"); 124 fwrite(m, sizeof(struct student), 3, f1); 125 fclose(f1); 126 127 FILE *f2 = fopen("TRANS_ROLL.DAT", "wb"); 128 fwrite(t, sizeof(struct trans), 3, f2); 129 fclose(f2); 130 }