Я пробую следующую программу на TurboC.Я получаю ошибку компоновщика для одного из прототипов функций.Ошибка: undefined symbol checkbranch(char near*) in module student.cpp
где student.cpp - это имя файла.Код компилируется без ошибок, и я не могу обнаружить ошибку здесь.Буду признателен за любую помощь.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<iomanip.h>
#include<fstream.h>
#include<string.h>
#include<ctype.h>
void checkbranch(char string[]);
void checkusn(char string[]);
void checksem(char string[]);
void checkname(char string[]);
fstream file;
class iobuffer
{
public: char maxbyte[120];
iobuffer();
};
iobuffer::iobuffer()
{
for(int i=0; i<120; i++)
maxbyte[i]='\0';
}
class student
{
public: char usn[20], name[25], sem[10], address[20], branch[10];
student()
{
strcpy(name,"");
strcpy(usn, "");
strcpy(sem, "");
strcpy(branch, "");
strcpy(address, "");
}
void read();
void display();
void rsem();
void rname();
void rusn();
void rbranch();
void raddress();
};
void student::rusn()
{
cout<<"\n\tEnter the new usn: ";
gets(usn);
checkusn(usn);
}
void student::rname()
{
cout<<"\n\tEnter the name: ";
gets(name);
checkname(name);
}
void student::rsem()
{
cout<<"\n\tEnter the sem: ";
gets(sem);
checksem(sem);
}
void checkbranch(char string[]);
void student::rbranch()
{
cout<<"\n\tEnter the branch: ";
gets(branch);
checkbranch(branch);
}
void student::raddress()
{
cout<<"\n\tEnter the address: ";
gets(address);
}
void checkname(char arr[])
{
for(int j=0; arr[j]!='\0'; j++)
if((!isalpha(arr[j]))&&(arr[j]!=' '))
{
cout<<"\n\tWrong input. Re-enter: ";
gets(arr);
j=-1;
}
}
void student::read()
{
cout<<"\n\tUSN: ";
gets(usn);
checkusn(usn);
cout<<"\n\tName: ";
gets(name);
checkname(name);
cout<<"\n\tSem: ";
gets(sem);
checksem(sem);
cout<<"\n\tBranch: ";
gets(branch);
checkbranch(branch);
cout<<"\n\tAddress: ";
gets(address);
}
void checksem(char arr[])
{
int x=0;
if((strcmp(arr,"1")==0)||(strcmp(arr,"2")==0)||(strcmp(arr,"3")==0)||(strcmp(arr,"4")==0)||(strcmp(arr,"5")==0)||(strcmp(arr,"6")==0)||(strcmp(arr,"7")==0)||(strcmp(arr,"8")==0))
x=1;
if(x==0)
{
cout<<"\n\tInvalid sem. Re-enter: ";
gets(arr);
checksem(arr);
}
}
void checkusn(char string[])
{
fstream ftemp;
char temp[20], tempusn[20], usn[20];
int i;
if((strlen(string)!=10)||(!isdigit(string[0]))||(!isdigit(string[3]))||(!isdigit(string[4]))||(!isdigit(string[7]))||(!isdigit(string[8]))||(!isdigit(string[9]))||(!isalpha(string[1]))||(!isalpha(string[2]))||(!isalpha(string[5]))||(!isalpha(string[6])))
{
cout<<"\n\tInvalid USN. Re-enter: ";
gets(string);
checkusn(string);
}
file.open("studentdb.txt",ios::in|ios::binary);
while(file.read(temp,120))
{
i=0;
while((tempusn[i]=temp[i])!='|')
i++;
tempusn[i]='\0';
if(strcmp(tempusn,string)==0)
{
cout<<"\n\tUSN already exists. Re-enter: ";
gets(string);
checkusn(string);
}
}
file.close();
}
void student::display()
{
cout<<setiosflags(ios::left);
cout<<setw(15)<<usn<<setw(20)<<name<<setw(10)<<sem<<setw(15)<<branch<<setw(25)<<address;
}
class fixedlength:public iobuffer
{
public: char buffer[120];
void pack(student s);
void unpack(student s);
};
void fixedlength::pack(student s)
{
strcpy(maxbyte, "");
strcpy(maxbyte, s.usn);
strcat(maxbyte,"|");
strcat(maxbyte, s.name);
strcat(maxbyte, "|");
strcat(maxbyte, s.sem);
strcat(maxbyte, "|");
strcat(maxbyte, s.branch);
strcat(maxbyte, "|");
strcat(maxbyte, s.address);
strcat(maxbyte, "#");
}
void fixedlength::unpack(student s)
{
strcpy(buffer, maxbyte);
for(int i=0, j=1, k=0; j<=5; i++, j++)
{
switch(j)
{
case 1: while(buffer[i]!='|')
s.usn[k++]=buffer[i++];
s.usn[k]='\0';
k=0;
break;
case 2: while(buffer[i]!='|')
s.name[k++]=buffer[i++];
s.name[k]='\0';
k=0;
break;
case 3: while(buffer[i]!='|')
s.sem[k++]=buffer[i++];
s.sem[k]='\0';
k=0;
break;
case 4: while(buffer[i]!='|')
s.branch[k++]=buffer[i++];
s.branch[k]='\0';
k=0;
break;
case 5: while(buffer[i]!='\0')
s.address[k++]=buffer[i++];
s.address[k]='\0';
k=0;
}
}
}
class delim:public fixedlength
{
public: void writerecord(student);
void readrecord(student);
void deleterecord(student, char*);
void searchrecord(student, char*);
void modifyrecord(student, char*);
};
void delim::writerecord(student s)
{
pack(s);
file.open("studentdb.txt", ios::app|ios::binary);
file.write((char*)&maxbyte, sizeof(maxbyte));
file.close();
}
void delim::readrecord(student s)
{
file.open("studentdb.txt", ios::in|ios::binary);
cout<<"\n\n File Contents\n\n";
while(file.read((char*)&maxbyte, sizeof(maxbyte)))
{
unpack(s);
cout<<endl;
s.display();
}
getch();
file.close();
}
void delim::searchrecord(student s, char *key)
{
int flag=0;
file.open("studentdb.txt",ios::in|ios::binary);
while((file.read((char*)&maxbyte,sizeof(maxbyte)))&&flag==0)
{
unpack(s);
if(!strcmp(s.usn,key))
{
flag=1;
s.display();
}
}
if(flag==0)
{
cout<<"\n\tSpecified record doesn't exist";
getch();
file.close();
}
}
void delim::deleterecord(student s, char *a)
{
int flag=0;
char x;
fstream ftemp;
file.open("studentdb.txt",ios::in|ios::binary);
ftemp.open("temp.txt", ios::out|ios::trunc|ios::binary);
cout<<"\n\tAre you sure you want to delete (y/n)?";
cin>>x;
if(x=='y'||x=='Y')
{
while(file.read((char*)&maxbyte, sizeof(maxbyte)))
{
unpack(s);
if(strcmp(s.usn,a)==0)
flag=1;
else
ftemp.write((char*)&maxbyte,sizeof(maxbyte));
}
}
if(flag==1)
{
file.close();
ftemp.close();
remove("studentdb.txt");
rename("temp.txt","studentdb.txt");
}
if(flag==0)
{
cout<<"\n\tThe specified record is not found\n";
file.close();
ftemp.close();
}
}
void delim::modifyrecord(student s, char *a)
{
int flag=0, choice;
file.open("studendb.txt",ios::in|ios::out|ios::binary);
while(file.read((char*)&maxbyte,sizeof(maxbyte)))
{
unpack(s);
if(strcmp(s.usn,a)==0)
{
char x;
flag=1;
cout<<"\n\t Current contents: \n\n\n";
s.display();
do
{
cout<<"What do you want to change: ";
cout<<"\n\t1.Name\n\t2. Sem\n\t3. Branch\n\t4. Address\n\t5. Confirm changes\n\t6. Return to main\n";
cout<<"Enter choic: ";
cin>>choice;
switch(choice)
{
case 1: s.rname(); break;
case 2: s.rsem(); break;
case 3: s.rbranch(); break;
case 4: s.raddress(); break;
case 5: break;
case 6: return;
default: cout<<"Invalid option\n";
}
}while(choice==1||choice==2||choice==3||choice==4);
cout<<"\n\tDo you want to modify (y\n)?";
cin>>x;
if(x=='y'||x=='Y')
{
pack(s);
file.seekg(-120,ios::cur);
file.write((char*)&maxbyte,sizeof(maxbyte));
}
else
break;
}
}
if(flag==0)
{
cout<<"\n\t Specified record doesn't exist\n";
file.close();
}
}
void main()
{
clrscr();
iobuffer i;
student s;
fixedlength f;
delim d;
int option;
char no[20], key[20];
for(;;)
{
cout<<"\n\nMenu:- ";
cout<<"\n\t1. Insert\n\t2. Display\n\t3. Delete\n\t4. Modify\n\t5. Search\n\t6. End\n\t";
cin>>option;
switch(option)
{
case 1: s.read();
d.writerecord(s);
break;
case 2: d.readrecord(s);
break;
case 3: cout<<"Enter the usn to delete\n";
gets(no);
d.deleterecord(s, no); break;
case 5: cout<<"\nEnter usn to be searched\n";
gets(key);
d.searchrecord(s,key);
break;
case 4: cout<<"\n\tEnter the usn to be modified\n";
gets(no);
d.modifyrecord(s,no);
break;
case 6: exit(0); break;
}
}
}
Я не был уверен, что будет ошибка, поэтому я попытался:
Изменение порядка прототипов операторов функции (даже тогда ошибкабудет только для checkbranch)
Запись прототипа функции для checkbranch в другом месте (снова будет ошибка)
- Удаление самого прототипа (а затем получить компиляциюошибка из-за отсутствия прототипа)