Here is my full program excluding the search and delete functions

K

kimimaro

Thank you for your help I think I know what the problem is. Firstly the
add_record cannot read the record.txt or something if the record.txt (in
which I used it to store the details of each record) is present in the
same directory. When it prompt
enter your selection from the menu, it will just stuck there so I cant
even create a new entry and thus I cant check the modify function in my
program. If it's not present, it will create a record.txt once I've add
everything in it when I view
in the record.txt file, these shows up
4198977 %[^/]%*c %c %c

I dont know if it's correct or it should be (for example) :
4198977(ID), Rebecca( Name), F(Gender), Accounting(Department)

Below are the source codes :

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

char Name[50];
char Department [4] [50] = {"Accounting", "Administration", "Management"
,
"Others"};
int ID[50];
char Gender [2] [50] = {"Male", "Female"} ;
char *stars="********================*********";
char *lines="---------------------------------";
char *empty=" ";
int txt_inserted;

/*Functions*/

void modify_record();
void add_record();
void search_record();
//void list_record();
void delete_record();
//void exit();
void menu();

/* MAIN */
main(){
clrscr();
menu();
getch();
return 0;
}

/* FUNCTION: MENU */
void menu(){
int selection;

FILE *start;
if((start = fopen("record.txt", "a+")) == NULL)
printf(" File record.txt is not found! Previous saved employee records
did
not loaded\n\n");
else {
fscanf(start, "%i %*c %c %*c, &ID", &Name, &Gender, &Department);
printf(" Values Uploaded: %i %*c %c %*c", &ID, &Name, &Gender,
&Department);
fclose(start);}

gotoxy(15,1);
puts("\n -------* [Welcome To Net Communication Human Resource]
*-------");
printf("\t%s\n",stars);
puts("\t#\t1.Staff Biodata Maintenance\t#");
puts("\t#\t2.Search Employee Records via Emplyee ID\t#");
puts("\t#\t3.Display all employee by department\t#");
puts("\t#\t4.Employee Record deletion\t#");
puts("\t#\t5.Exit\t#");
printf("\t%s\n",stars);
printf("\n Enter Your Selection: ");
fflush(stdin);
scanf("%d", &selection);

if (selection == 1) add_record();
else if (selection == 2) search_record();
//else if (selection == 3) list_record();
else if (selection == 4) delete_record();
//else if (selection == 5) exit();
else{ printf(" Please only select from the above menu"); getch();
clrscr(); menu();}
}

/*Function 1a*/

void modify_record(){
char Name[50];
int Target, ID, selection, Found=0;
FILE *rec, *temp;

temp=fopen("temp.txt", "w+");
if((rec=fopen("record.txt", "r+")) == NULL)
printf("\nerror: file not found.\n");
else {
printf(" ENTER the employee ID to be modified: ");
scanf("%d", &Target);
while(!feof(rec)){
fscanf(rec, "%i %*c %c %*c", &ID, &Name, &Gender, &Department);
if(feof(rec))
break;
else if(Target==ID)
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender, Department);


else
{
Found=1;
printf("\n Record Found! Please re-enter details for the
employee ::%s::", Name);

/*Modify employee details*/


gotoxy(1,15);
printf("\n Employee details edit ");
do
{
gotoxy(1, 22);
printf(" Name : ");
gotoxy(10, 22);
fflush(stdin);
scanf("%s",&Name);
printf(" Gender : ");
fflush(stdin);
scanf("%s",&Gender);
printf("Please enter the department for this employee, [0]
Administration [1] Management [2] Accounting [3] Others", empty, empty,
empty, empty);
fflush(stdin);
scanf("%d",&selection);
if(selection==0 ){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==1){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==2){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==3){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else
printf("\n\n INVALID CHOICE! PLEASE Re-Enter.\a");
} while(selection < 0 || selection > 3);
}

}
if(!Found)
printf("\n RECORD CANNOT BE FOUND!\n");
add_record();
}
fclose(rec);
fclose(temp);
remove("record.txt");
rename("temp.txt", "record.txt");
getch();
clrscr();
menu();
}




/*Function 1b adding employee*/

void add_record(){
int ID;
int selection;
FILE *rec, *temp;

if ((rec=fopen("record.txt","a+"))==NULL)
ID = 1;
else
{
do{
fscanf(rec, "%i %*c %c %*c", &ID, &Name, &Gender, &Department);
}while(!feof(rec));
ID += 1;
}

do {
gotoxy(2, 15);
printf("\n\n 0) %s\n 1) %s\n 2) %s\n 3) %s\n\n [Enter Department for
this new employee]: ", Department[0], Department[1], Department[2],
Department[3]);
fflush(stdin);
scanf("%d", &selection);
if((selection != 0) && (selection != 1) && (selection !=2) &&
(selection !=3)) {gotoxy(1, 24); printf(" >>invalid Department<<
Retry!\a");}
} while((selection != 0) && (selection != 1) && (selection !=2) &&
(selection !=3));


clrscr();
printf("The new ID for this employee: %04i", ID);
printf("\n Employee Name : \n");
fflush(stdin);
fgets(Name, 49, stdin);
printf("\n Employee Gender: \n");
scanf("%c", &Gender);
printf("\nThe New Employee Record have successfully Saved!");
fprintf(rec, "%i %[^/]%*c %c %c", ID, Name, Gender,
Department);
printf("\n Employee Status Stored!");
fclose(rec);

}
 
K

kimimaro

ooppps sorry for the double post I didnt see it under a few topics thread
and I accidentally refreshed when I've posted this new topic hopefully
there isn't another post appeared. Sorry ~Gome Gome Gomenasai~ I can get
so careless on things *sigh* im really sorry
 
M

Malcolm

kimimaro said:
Thank you for your help I think I know what the problem is. Firstly the
add_record cannot read the record.txt or something if the record.txt (in
which I used it to store the details of each record) is present in the
same directory. When it prompt
enter your selection from the menu, it will just stuck there so I cant
even create a new entry and thus I cant check the modify function in my
program. If it's not present, it will create a record.txt once I've add
everything in it when I view
in the record.txt file, these shows up
4198977 %[^/]%*c %c %c

I dont know if it's correct or it should be (for example) :
4198977(ID), Rebecca( Name), F(Gender), Accounting(Department)

Below are the source codes :

#include <stdio.h>
#include <conio.h>
conio.h is not an ANSI header. This is not an error, but means that your
program will not be portable.
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

char Name[50];
char Department [4] [50] = {"Accounting", "Administration", "Management"
,
"Others"};
int ID[50];
char Gender [2] [50] = {"Male", "Female"} ;
Sex. "Gender" is masculine or feminine and refers to grammar. Human beings
have sex.
char *stars="********================*********";
char *lines="---------------------------------";
char *empty=" ";
int txt_inserted;
/*Functions*/

void modify_record();
void add_record();
void search_record();
//void list_record();
void delete_record();
//void exit();
void menu();

/* MAIN */
Your comments are pretty useless. We all know that main is the MAIN
function. How about telling us what the program is supposed to do?
main(){
clrscr();
menu();
getch();
return 0;
}
This is good, a main() that consists enirely of subroutine calls.
/* FUNCTION: MENU */
Again, tell us what the function does.
void menu(){
int selection;

FILE *start;
if((start = fopen("record.txt", "a+")) == NULL)
printf(" File record.txt is not found! Previous saved employee records
did
not loaded\n\n");
else {
fscanf(start, "%i %*c %c %*c, &ID", &Name, &Gender, &Department);
This is pretty hopeless. fscanf() writes to pointers that you supply. "Name"
is a string, so you want the %s identifier. "Gender" might be a single
letter, in which case you pass the address of a char, or it might be a
string, in which case you pass the address of an array and use the %s
identifier. In neither case do you pass an array of strings, which is what
"Gender"is at the moment.
printf(" Values Uploaded: %i %*c %c %*c", &ID, &Name, &Gender,
&Department);
Confusingly, the format strings used by printf() and scanf() are not
mutually compatible though they are similar. "*" menas different things, for
example.
fclose(start);}

gotoxy(15,1);
puts("\n -------* [Welcome To Net Communication Human Resource]
*-------");
printf("\t%s\n",stars);
puts("\t#\t1.Staff Biodata Maintenance\t#");
puts("\t#\t2.Search Employee Records via Emplyee ID\t#");
puts("\t#\t3.Display all employee by department\t#");
puts("\t#\t4.Employee Record deletion\t#");
puts("\t#\t5.Exit\t#");
printf("\t%s\n",stars);
printf("\n Enter Your Selection: ");
fflush(stdin);
You flush a toilet, but not a tap. flfush() is for output only.
scanf("%d", &selection);
This is OK. scanf() returns the number of fields successfully converted.
if( scanf("%d", &selection) == 1)
{
/* processing */
}
else
{
/* error */
}

will do the trick.
if (selection == 1) add_record();
else if (selection == 2) search_record();
//else if (selection == 3) list_record();
else if (selection == 4) delete_record();
//else if (selection == 5) exit();
else{ printf(" Please only select from the above menu"); getch();
clrscr(); menu();}
}

/*Function 1a*/

void modify_record(){
char Name[50];
int Target, ID, selection, Found=0;
FILE *rec, *temp;

temp=fopen("temp.txt", "w+");
if((rec=fopen("record.txt", "r+")) == NULL)
printf("\nerror: file not found.\n");
else {
printf(" ENTER the employee ID to be modified: ");
scanf("%d", &Target);
while(!feof(rec)){
fscanf(rec, "%i %*c %c %*c", &ID, &Name, &Gender, &Department);
if(feof(rec))
break;
else if(Target==ID)
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender, Department);


else
{
Found=1;
printf("\n Record Found! Please re-enter details for the
employee ::%s::", Name);

/*Modify employee details*/


gotoxy(1,15);
printf("\n Employee details edit ");
do
{
gotoxy(1, 22);
printf(" Name : ");
gotoxy(10, 22);
fflush(stdin);
scanf("%s",&Name);
printf(" Gender : ");
fflush(stdin);
scanf("%s",&Gender);
printf("Please enter the department for this employee, [0]
Administration [1] Management [2] Accounting [3] Others", empty, empty,
empty, empty);
fflush(stdin);
scanf("%d",&selection);
if(selection==0 ){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==1){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==2){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==3){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else
printf("\n\n INVALID CHOICE! PLEASE Re-Enter.\a");
} while(selection < 0 || selection > 3);
}

}
if(!Found)
printf("\n RECORD CANNOT BE FOUND!\n");
add_record();
}
fclose(rec);
fclose(temp);
remove("record.txt");
rename("temp.txt", "record.txt");
getch();
clrscr();
menu();
}




/*Function 1b adding employee*/

void add_record(){
int ID;
int selection;
FILE *rec, *temp;

if ((rec=fopen("record.txt","a+"))==NULL)
ID = 1;
else
{
do{
fscanf(rec, "%i %*c %c %*c", &ID, &Name, &Gender, &Department);
}while(!feof(rec));
ID += 1;
}

do {
gotoxy(2, 15);
printf("\n\n 0) %s\n 1) %s\n 2) %s\n 3) %s\n\n [Enter Department for
this new employee]: ", Department[0], Department[1], Department[2],
Department[3]);
fflush(stdin);
scanf("%d", &selection);
if((selection != 0) && (selection != 1) && (selection !=2) &&
(selection !=3)) {gotoxy(1, 24); printf(" >>invalid Department<<
Retry!\a");}
} while((selection != 0) && (selection != 1) && (selection !=2) &&
(selection !=3));


clrscr();
printf("The new ID for this employee: %04i", ID);
printf("\n Employee Name : \n");
fflush(stdin);
fgets(Name, 49, stdin);
printf("\n Employee Gender: \n");
scanf("%c", &Gender);
printf("\nThe New Employee Record have successfully Saved!");
fprintf(rec, "%i %[^/]%*c %c %c", ID, Name, Gender,
Department);
printf("\n Employee Status Stored!");
fclose(rec);

}

You made similar mistakes in the above functions. Try playing about with
scanf() and inputting lines until you are comfortable with how to use it.
 
B

Barry Schwarz

Thank you for your help I think I know what the problem is. Firstly the
add_record cannot read the record.txt or something if the record.txt (in
which I used it to store the details of each record) is present in the
same directory. When it prompt
enter your selection from the menu, it will just stuck there so I cant
even create a new entry and thus I cant check the modify function in my
program. If it's not present, it will create a record.txt once I've add
everything in it when I view
in the record.txt file, these shows up
4198977 %[^/]%*c %c %c

I dont know if it's correct or it should be (for example) :
4198977(ID), Rebecca( Name), F(Gender), Accounting(Department)

Below are the source codes :

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

char Name[50];
char Department [4] [50] = {"Accounting", "Administration", "Management"
,
"Others"};
int ID[50];
char Gender [2] [50] = {"Male", "Female"} ;
char *stars="********================*********";
char *lines="---------------------------------";
char *empty=" ";
int txt_inserted;

/*Functions*/

void modify_record();
void add_record();
void search_record();
//void list_record();
void delete_record();
//void exit();
void menu();

/* MAIN */
main(){
clrscr();
menu();
getch();
return 0;
}

/* FUNCTION: MENU */
void menu(){
int selection;

FILE *start;
if((start = fopen("record.txt", "a+")) == NULL)

Why do you open the file for update when the only I/O you perform is
read?
printf(" File record.txt is not found! Previous saved employee records
did
not loaded\n\n");

You need to learn to indent. It will save you much aggravation later.
else {
fscanf(start, "%i %*c %c %*c, &ID", &Name, &Gender, &Department);

There is a mismatch between your format specifications and the
subsequent arguments. As coded, you have two formats that will
transfer data but three arguments to receive the data.

%i requires an int*. &Name is not related to any int. Did you
perhaps mean to place the &ID outside the format string? That would
be almost correct. &ID has type pointer to array of 50 int, that is
int (*)[50], not the same thing as int*. I don't know why ID is an
array but you could make it correct with &ID[0].

You did not describe your input file so I don't know if %*c is
correct or if it should be %*s.

The next %c should probably be %s. It is extremely unlikely that
you meant name to be a single character. %s requires a char*. &Name
is of type pointer to array of 50 char, syntactically coded as char
(*)[50]. Not nearly the same thing. In this case, you want Name
(without the &).

See above regarding the next %*c.

Why are you reading into Gender when Gender is already
initialized? Do you intend to destroy one of the initialized values?

Where is the format specifier for Department? Why are you
overriding the initialization?

Did you mean something along the lines of

fscanf(start, "%i %*c %s %*c %c %*c %s",
&ID, Name, &Gender[0][0], Department[0]);
printf(" Values Uploaded: %i %*c %c %*c", &ID, &Name, &Gender,
&Department);

You have similar problems here.

%i requires an int, not an int* and definitely not an int(*)[50].

What do you thing the %*c does? The * requires an int in the
argument list. The c requires a char*. You have neither.

Name cannot be printed with c format, you will only get the first
letter.
fclose(start);}

gotoxy(15,1);
puts("\n -------* [Welcome To Net Communication Human Resource]
*-------");
printf("\t%s\n",stars);
puts("\t#\t1.Staff Biodata Maintenance\t#");
puts("\t#\t2.Search Employee Records via Emplyee ID\t#");
puts("\t#\t3.Display all employee by department\t#");
puts("\t#\t4.Employee Record deletion\t#");
puts("\t#\t5.Exit\t#");
printf("\t%s\n",stars);
printf("\n Enter Your Selection: ");
fflush(stdin);

fflush is not defined for input streams, only for output.
scanf("%d", &selection);

if (selection == 1) add_record();
else if (selection == 2) search_record();
//else if (selection == 3) list_record();
else if (selection == 4) delete_record();
//else if (selection == 5) exit();
else{ printf(" Please only select from the above menu"); getch();
clrscr(); menu();}

Do you really want to use recursion here?
}

/*Function 1a*/

void modify_record(){
char Name[50];

This will hide the previous declaration of Name which was at file
scope. This Name is a completely different variable. This may be
what you intended but this type of abuse needlessly increases the
maintenance effort.
int Target, ID, selection, Found=0;
FILE *rec, *temp;

temp=fopen("temp.txt", "w+");
if((rec=fopen("record.txt", "r+")) == NULL)
printf("\nerror: file not found.\n");
else {
printf(" ENTER the employee ID to be modified: ");
scanf("%d", &Target);
while(!feof(rec)){
fscanf(rec, "%i %*c %c %*c", &ID, &Name, &Gender, &Department);
if(feof(rec))
break;

PLEASE indent consistently.
else if(Target==ID)
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender, Department);


else
{
Found=1;
printf("\n Record Found! Please re-enter details for the
employee ::%s::", Name);

Strange that you should claim the record is found here when this else
will only execute when the previous if is false which means that
Target does NOT match ID.
/*Modify employee details*/


gotoxy(1,15);
printf("\n Employee details edit ");
do
{
gotoxy(1, 22);
printf(" Name : ");
gotoxy(10, 22);
fflush(stdin);
scanf("%s",&Name);
printf(" Gender : ");
fflush(stdin);
scanf("%s",&Gender);
printf("Please enter the department for this employee, [0]
Administration [1] Management [2] Accounting [3] Others", empty, empty,
empty, empty);

Four arguments after the format string and not a single format
specification within the string. What was your intent here? Did you
really want everything on one line?
fflush(stdin);
scanf("%d",&selection);
if(selection==0 ){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);

What do you think printing empty accomplishes?
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==1){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==2){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}
else if(selection==3){
printf("\n Your selection is %s\n\n%s%s\n ",
Department[selection], empty, empty);
fprintf(temp, "%i %*c %c %*c", ID, Name, Gender,
Department[selection]);
}

Is there some reason you repeat the same block of code four times?
Wouldn't it be easier to check for a value between 0 and 3 and use one
block of code?
else
printf("\n\n INVALID CHOICE! PLEASE Re-Enter.\a");
} while(selection < 0 || selection > 3);
}

}
if(!Found)
printf("\n RECORD CANNOT BE FOUND!\n");
add_record();
}
fclose(rec);
fclose(temp);
remove("record.txt");
rename("temp.txt", "record.txt");
getch();
clrscr();
menu();

More unintended recursion?
}




/*Function 1b adding employee*/

void add_record(){
int ID;
int selection;
FILE *rec, *temp;

if ((rec=fopen("record.txt","a+"))==NULL)
ID = 1;
else
{
do{
fscanf(rec, "%i %*c %c %*c", &ID, &Name, &Gender, &Department);
}while(!feof(rec));
ID += 1;
}

do {
gotoxy(2, 15);
printf("\n\n 0) %s\n 1) %s\n 2) %s\n 3) %s\n\n [Enter Department for
this new employee]: ", Department[0], Department[1], Department[2],
Department[3]);
fflush(stdin);
scanf("%d", &selection);
if((selection != 0) && (selection != 1) && (selection !=2) &&
(selection !=3)) {gotoxy(1, 24); printf(" >>invalid Department<<
Retry!\a");}
} while((selection != 0) && (selection != 1) && (selection !=2) &&
(selection !=3));


clrscr();
printf("The new ID for this employee: %04i", ID);
printf("\n Employee Name : \n");

PLEASE PLEASE indent consistently.
fflush(stdin);
fgets(Name, 49, stdin);

Why 49? Name is sized as 50.
printf("\n Employee Gender: \n");
scanf("%c", &Gender);
printf("\nThe New Employee Record have successfully Saved!");
fprintf(rec, "%i %[^/]%*c %c %c", ID, Name, Gender,
Department);
printf("\n Employee Status Stored!");
fclose(rec);

}



<<Remove the del for email>>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top