File Operations in C – DBMS Example

File Operations in C: अभी तक हमने जितने भी प्रोग्राम बनाए हैं, उनमें सभी Functions का अलग-अलग उपयोग किया है। अब हम एक ऐसा Program बनाते हैं, जिसमें इन सभी Function का उपयोग हो रहा है। इससे हम ये बताना चाहते हैं, कि “C” द्वारा हम एक Database को किस प्रकार से Handle कर सकते हैं।

किसी भी Database Management System में हमें कुछ काम जैसे नए Records को File में Add करना, किसी Record को Modify करना, कोई अनावश्‍यक Record Delete करना, File के Records को देखना आदि अवश्‍य ही करने पडते हैं। यहां कुछ Points दिये जा रहे हैं, जो इन कामों को पूरा करने में मदद करेंगे और एक प्रोग्राम द्वारा इन्हे समझाया भी गया है:

  • जब भी कभी हमें किसी File में नया Record Add करना हो तो उसे Data File के अंत में Add करना चाहिये। जैसे कि हम किसी Register में नया Record हमेंशा सबसे अंत में लिखते हैं।
  • Records को जब Screen पर Show करना हो तो प्रथम Record से अन्तिम Record तक के सभी Records Screen पर दिखाए जाने चाहियें।
  • जब भी किसी Record को Modify करना हो तो पुराने Record पर नया Record Over write किया जाना चाहिये।
  • जब किसी File से किसी Record को Delete करना हो, तो जिस Record को Delete करना है, उसे छोड कर शेष सभी records को एक Temporary File में Store कर लेना चाहिये। फिर पुरानी File को Delete करके उस Temporary File का नाम पुरानी File के नाम से Rename कर लेना चाहिये।
  • File को Reading व Writing के लिए Binary mode में ही Open करना चाहिये। ये कई प्रकार से अच्छा रहता है।
  • एक File को सिर्फ एक बार ही Open करना चाहिये और एक ही बार Program के अंत में File को बंद करना चाहिये।

इन्ही सब बातों पर निर्भर करते हुए यहां एक Program बनाया गया है, जिसमें हम Records को Add, Modify, ListDelete कर सकते हैं।

// Program
#include<stdio.h>
main()
{
	FILE *fp, *ft;
	char another, choice;
	struct emp
	{
		char name[20];
		int age;
		float salary;
	};

	struct emp e;
	char e_name[20];
	long int recsize;

	fp =fopen("Emp.dat", "rb");
	{
		fp = fopen("Emp.dat", "wb");
		if(fp == NULL)
		perror("Could Not Open File");
	}

	recsize = sizeof(e);
	while(1)
	{
		clrscr();
		gotoxy(30,10);
		printf("1    Add Records");
		gotoxy(30,12);
		printf("2    List Records");
		gotoxy(30,14);
		printf("3    Modify Records");
		gotoxy(30,16);
		printf("4    Delete Records");
		gotoxy(30,18);
		printf("0    Exit");
		gotoxy(30,20);
		printf("Enter Your Choice");
		fflush(stdin);
		choice = getchar();
		switch(choice)
		{
			case '1':
				fseek(fp, 0, SEEK_END);
				another = 'y';
				while(another == 'y')
				{
					printf("Enter Name Age and Salary:");
					scanf("%s %d %f", e.name, &e.age, &e.salary);
					fwrite(&e, recsize, 1, fp );
					printf("Do You Want To Add Another Record: Y/N");
					another = getche();
				}
				break;

			case '2':
				rewind(fp);
				while(fread(&e, recsize, 1, fp ) == 1)
				printf("\n %s\t %d\t %f\t", e.name, e.age, e.salary);
				break;

			case '3':
				another = 'y';

				while(another == 'y')
				{
					printf("Enter Name :");
					scanf("%s ", e_name);
					rewind(fp);
					while(fread(&e, recsize, 1, fp) ==1)
					{
						if(strcmp(e.name, e_name) == 0)
						{
							printf("\n Enter New Name, Age and Salary :");
							scanf("%s %d %f", e.name, &e.age, &e.salary);
							fseek(fp, -recsize, SEEK_CUR);
							fwrite(&e, recsize, 1, fp);
							break;
						}
					}

					printf("\n Do You Want To Modify Another Record");
					fflush(stdin);
					another = getche();
				}
				break;

			case '4':
				another = 'y';
				while(another == 'y')
				{
					printf("\n Enter name of Employee to Delete");
					scanf("%s", e_name);
					ft = fopen("TEMP.DAT", "wb")'
					rewind(fp);

					while(fread(&e, recsize, 1, fp) == 1)
					{
						if(strcmp(e.name, e_name) != 0)
						fwrite(&e, recsize, 1, ft);
					}

					fclose(fp);
					fclose(ft);
					remove("Emp.dat");
					rename("TEMP.DAT", "Emp.dat");
					fp = fopen("Emp.dat","rb+");
					printf("\n Delete Another Record : Y/N );
					fflush(stdin);
					another = getche();
				}
				break;

			case '0' : 
				fclose(fp);
				exit();
		}
	}
}

इस Program में एक Structure के द्वारा File में Data Input किया जाता है और इसी Structure का प्रयोग करके File से Data प्राप्त भी किया जाता है। सभी Variable के Declaration व Definition के बाद सर्वप्रथम Program Control एक File Emp.dat को Binary Reading Mode मे Open करता है और इस File का Address एक Pointer fp को Assign करता है। फिर निम्न Statement द्वारा Structure Variable e की Size ज्ञात करके, उस Size को recsize नाम के Variable में Store करता है:

        recsize = sizeof(e);

फिर Program Control को while(1) Statement प्राप्त होता है। जब किसी While के कोष्‍ठक में 0 के अलावा कोई भी मान लिखा जाता है, तो while Loop की Condition हमेंशा सत्‍य रहती है, जिससे इस Loop के Statement Block में लिखे Statement हमेंशा Screen पर Print रहते है।

इस कारण से इस Loop के Statement Block में लिखे सारे Statements Screen पर हमेंशा रहते हैं, जब तक कि Program Control को exit() Function प्राप्त नहीं हो जाता। इन Statements में से हमें जो भी काम करना होता है, उस अंक को चुन लेते हैं। जैसे हमें कोई Record Add करना हो तो अंक 1 Press करते हैं।

जब हम अंक 1 Press करते हैं, तब Program Control ये मान getche() Function द्वारा choice नाम के Variable में Store कर देता है। फिर switch Statement द्वारा ये check किया जाता है कि choice का मान switch Statement Block की किस Case से मेल करता है। जिस Case से मेल करता है, Program Control उस Case के Statements को Execute कर देता है।

जब हम अंक 1 Input करते हैं, तब Program Control switch के Case 1: के Statements को Execute करता है। यहां सबसे पहला Statement निम्न होता है, जो File pointer को 0 record के step में File के अंत से Move करता है:

        fseek(fp, 0, SEEK_END);

अब यहां एक While Loop का प्रयोग किया गया है। इस Loop के द्वारा Name Age व Salary को Input किया जाता है। जब Record Input किया जाता है तब ये Input किये गए मान Structure में जाकर Store हो जाते हैं। फिर निम्न Statement द्वारा ये Data File में Write किया जाता है:

        fwrite(&e, recsize, 1, fp );

यदि और Data Input करना हो, तो यहां एक Message आता है। यदि यहां Y Input किया जाता है तो हम वापस इसी Loop में पहुंच जाते हैं और वापस ;हीं प्रक्रिया चलती है। यदि हम Y के अलावा कोई भी Key Press करते हैं, तो इस Loop से बाहर आ जाते हैं। इस Loop के बाहर आते ही Program Control को break मिलता है और हम switch Statement से बाहर वापस Main Menu पर आ जाते हैं।

जब हमें इस File की पूरी List देखनी होती है, तब हम दूसरा Option Choose करते हैं। जब इस प्रोग्राम का दूसरा Output Choose किया जाता है, तब switch Statement का दूसरे Case 2: के Statements Execute होते हैं, जहां निम्न Statement  द्वारा File के सारे Data Screen पर Print हो जाते हैं:

        while(fread(&e, recsize, 1, fp ) = = 1)

जब हम तीसरा Option Choose करते हैं, तब switch के तीसरे Case 3: के Statements Execute होते हैं। यहां भी एक while Loop का प्रयोग किया गया है, ताकि यदि हमें एक से अधिक Records Modify करने हों, तो किया जा सके। यहां निम्न Statement द्वारा उस व्‍यक्ति का नाम, जिसका Record Modify करना है, e_name नाम के Variable में लिया जाता है:

        Enter Name :

फिर निम्नानुसार अगले Statement द्वारा पुन: File Pointer को File की शुरूआत पर ले जाया जाता है:

        rewind(fp);

फिर निम्न Statement द्वारा क्रम से File के हर Record पर File Pointer को Move किया जाता है:

        while(fread(&e, recsize, 1, fp) ==1)

जैसे ही File Pointer एक Record Move होता है, निम्न Statement द्वारा ये Check किया जाता है कि Variable e_name में जो नाम है, वह नाम File के उस Record से मेल करता है या नहीं जिस Record पर Currently File Pointer स्थित है:

        if(strcmp(e.name, e_name) = = 0)

यदि e_name का String File के उस Record में नहीं मिलता, जहां पर File Pointer स्थित है, तो File Pointer अगले Record को Point करने लगता है। लेकिन यदि File pointer जिस Record पर है, उस Record में वही नाम है, जो नाम e_name नाम के Variable में है, तो ये Statement 0 मान Return करता है।

यानी File के Record के नाम व e_name नाम के Variable में स्थित नाम की तुलना की जाती है। जब दोनों नाम एक समान होते हैं, तो strcmp() Function 0 Return करता है। जैसे ही ये Function 0 return करता है, if Condition सत्‍य हो जाती है और Program Control if Statement Block में प्रवेश करता है।

if Statement Block में आते ही Program Control को निम्न Statement प्राप्त होती है:

        fseek(fp, -recsize, SEEK_CUR);

        while(fread(&e, recsize, 1, fp) = =1);

इस while Statement से fseek() तब तक अगले Record पर Move करता रहता है, जब तक कि इसे Records क्रम से प्राप्त होते जाते हैं। if Condition Block में प्रवेश करने से पहले ही fp अगले Record को Point करने लगता है। इसलिए जब हमें वह Record प्राप्त हो जाता है, जिसे Modify करना है, तब तक fseek() Function अगले Record को Point करने लगता है। इसलिए ये जरूरी हो जाता है, कि File Pointer को एक Record पीछे सरकाया जाए। निम्न Statement द्वारा हम ये काम करते हैं, यानी एक Record पीछे उस Record पर आ जाते हैं, जिसे Modify करना है।

        fseek(fp, -recsize, SEEK_CUR);

अब निम्न Statement द्वारा हम जो Data Input करते हैं, वो Data पुराने Data पर Over Write हो जाता है:

        fwrite(&e, recsize, 1, fp);

अब वापस ये Message आता है कि क्या और Records Modify करने हैं या नहीं। यदि हम Y Press करते हैं, तो वापस यही प्रक्रिया होती है और पुराना Data नए  Data से Over Write हो जाता है लेकिन यदि हम Y Press नहीं करते हैं, तो इस while Loop से बाहर आ जाते हैं। बाहर आते ही Program Control को break मिलता है और Program Control वापस Main Menu पर आ जाता है।

जब हमें किसी Employee का Record File से Delete करना होता है, तब हम अंक 4 Press करके switch के Case ‘4’: के Statements को Execute करते हैं। जब चौथा Option Choose किया जाता है, तब हमें उस Employee का नाम Input करना होता है, जिसका Record Delete करना है। ये नाम e_name नाम के Variable में Store हो जाता है।

अब एक और नई File Open करते हैं, जिसका File Pointer ft है और rewind() Function द्वारा वापस से fp File Pointer को Emp.dat नाम की File के प्रारम्भ में ले जाया जाता है। निम्न Statement द्वारा वापस क्रम से File Pointer को हर Record पर Move किया जाता है:

        while(fread(&e, recsize, 1, fp) == 1)

और वापस से e_name में Stored String को File में निम्न Statement  द्वारा खोजा जाता है:

        if(strcmp(e.name, e_name) != 0)

जैसे ही e_name नाम के Variable में Stored String File में स्थित किसी Record से मेल करती है, उस मेल करने वाले Record को छोड कर हर Record को क्रम से निम्न Statement द्वारा Open की गई दूसरी File जिसका File Pointer ft है, में Copy कर दिया जाता है:

        fwrite(&e, recsize, 1, ft);

अब दोनो Files को Close करते समय निम्न Statement द्वारा Emp.dat नाम की हमारी पहली File को Delete कर दिया जाता है:

        remove(“Emp.dat”);

और निम्न Statement द्वारा उस File को, जिसे हमने बाद में Open किया था और Delete करने वाले Record को छोड कर शेष Data को जिस File में Copy कर लिया था, उसे Emp.dat नाम से Rename कर लेते हैं:

        rename(“TEMP.DAT”, “Emp.dat”);

अब इस File में Deleted Data के अलावा सभी Data हैं, यानी जो Data हमें Delete करना था, वह Delete हो चुका है। निम्न Statement  द्वारा वापस से Emp.dat नाम की File को Open कर लिया जाता है:

        fp = fopen(“Emp.dat”,”rb+”);

यदि हमें और Records Delete करने हों तो इस चौथे Case के साथ भी एक while Loop प्रयोग किया गया है, जिसमें ये Message आता है कि क्या आप और Records Delete करना चाहते हैं। यदि यहां Y Press करें तो वापस पूरी की पूरी प्रक्रिया दोहराई जाती है और यदि हम और Record Delete करना नहीं चाहते तो यहां y के अलावा कुछ भी Press कर देते हैं।

इस Case से बाहर आते ही हमें वापस break मिलता है, जिससे हम वापस Main Menu में पहुंच जाते हैं। यदि हमें इस Program से बाहर आना हो तो हम 0 press करते है। 0 Press करते ही switch के पांचवे Case 0: के Statements Execute होते हैं जहां Program Control को exit() Function मिलता है और Program Control Program से बाहर आ जाता है। (File Operations in C – Wiki)

Buy this eBook to read more about “File System in C

C Programming Language in Hindi - BccFalna.com ये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook  C Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C Programming Language in Hindi | Page: 477 + 265 | Format: PDF

BUY NOW GET DEMO REVIEWS