adresse book with C programming, i have problem with library i think, couldn't complite my code
- by osabri
I've divided my code in small programm so it can be easy to excute
/* ab_error.c : in case of errors following messages will
be displayed */
#include "adressbook.h"
static char *errormsg[] =
{ "",
"\nNot enough space on disk",
"\nCannot open file",
"\nCannot read file",
"\nCannot write file"
};
void check(int error)
{
switch(error)
{
case 0:
return;
case 1: write_file();
case 2:
case 3:
case 4:
system("cls");
fputs(errormsg[error], stderr);
exit(error);
}
}
2nd
/* ab_fileio.c : functions for file input/output */
include "adressbook.h"
static char ab_file[] = "ADRESSBOOK.DAT"; //file to save the entries
int read_file(void)
{
int error = 0;
FILE *fp;
ELEMENT *new_e, *last_e = NULL;
DATA buffer;
if( (fp = fopen(ab_file, "rb")) == NULL) return -1; //no file found
while (fread(&buffer, sizeof(DATA), 1, fp) == 1)
//reads one list element after another
{
if( (new_e = make_element()) == NULL)
{
error = 1; break; //not enough space
}
new_e->person = buffer; //copy data to new element
new_e->next = NULL;
if(hol.first == NULL) //list is empty?
hol.first = new_e; //yes
else
last_e->next = new_e; //no
last_e = new_e;
++hol.amount;
}
if( !error && !feof(fp) )
error = 3; //cannot read file
fclose(fp);
return error;
}
/-------------------------------/
int write_file(void)
{
int error = 0;
FILE *fp;
ELEMENT *p;
if( (p = hol.first) == NULL) return 0; //list is empty
if( (fp = fopen(ab_file, "wb")) == NULL) return 2; //cannot open
while( p!= NULL)
{
if( fwrite(&p->person, sizeof(DATA), 1, fp) < 1)
{
error = 4; break; //cannot write
}
p = p->next;
}
fclose(fp);
return error;
}
3rd
/* ab_list.c : functions to manipulate the list */
#include "adressbook.h"
HOL hol = {0, NULL}; //global definition for head of list
/* -------------------- */
ELEMENT *make_element(void)
{
return (ELEMENT *)malloc( sizeof(ELEMENT) );
}
/* -------------------- */
int ins_element( DATA *newdata)
{
ELEMENT *new_e, *pre_p;
if((new_e = make_element()) == NULL)
return 1;
new_e ->person = *newdata; // copy data to new element
pre_p = search(new_e->person.family_name);
if(pre_p == NULL) //no person in list
{
new_e->next = hol.first; //put it to the begin
hol.first = new_e;
}
else
{
new_e->next = pre_p->next;
pre_p->next = new_e;
}
++hol.amount;
return 0;
}
int erase_element( char name, char surname )
{
return 0;
}
/* ---------------------*/
ELEMENT *search(char *name)
{
ELEMENT *sp, *retp; //searchpointer, returnpointer
retp = NULL;
sp = hol.first;
while(sp != NULL && sp->person.family_name != name)
{
retp = sp;
sp = sp->next;
}
return(retp);
}
4th
/* ab_screen.c : functions for printing information on screen */
#include "adressbook.h"
#include <conio.h>
#include <ctype.h>
/* standard prompts for in- and output */
static char pgmname[] = "---- Oussama's Adressbook made in splendid C ----";
static char options[] = "\
1: Enter new adress\n\n\
2: Delete entry\n\n\
3: Change entry\n\n\
4: Print adress\n\n\
Esc: Exit\n\n\n\
Your choice . . .: ";
static char prompt[] = "\
Name . . . .:\n\
Surname . . :\n\n\
Street . . .:\n\n\
House number:\n\n\
Postal code :\n\n\
Phone number:";
static char buttons[] = "\
<Esc> = cancel input <Backspace> = correct input\
<Return> = assume";
static char headline[] = "\
Name Surname Street House Postal code Phone number \n\
------------------------------------------------------------------------";
static char further[] = "\
-------- continue with any key --------";
/* ---------------------------------- */
int menu(void) //show menu and read user input
{
int c;
system ("cls");
set_cur(0,20); puts(pgmname);
set_cur(6,0); printf("%s", options);
while( (c = getch()) != ESC && (c < '1' || c > '4'))
putch('\a');
return c;
}
/* ---------------------------------- */
int print_adr_book(void) //display adressbook
{
int line = 1;
ELEMENT *p = hol.first;
system("cls");
set_cur(0,20); puts(pgmname);
set_cur(2,0); puts(headline);
set_cur(5,0);
while(p != NULL) //run through list and show entries
{
printf("%5d %-15s ",line, p->person.family_name);
printf("%-12s %-15s ", p->person.given_name, p->person.street);
printf("%-4d %-5d %-12d\n",p->person.house_number, p->person.postal_code, p->person.phone);
p = p->next;
if( p == NULL || ++line %16 == 1) //end of list or screen is full
{
set_cur(24,0); printf("%s",further);
if( getch() == ESC)
return 0;
set_cur(5,0); scroll_up(0,5,24);//puts(headline);
}
}
return 0;
}
/* -------------------------------------------*/
int make_entry(void)
{
char cache[50];
DATA newperson;
ELEMENT *p;
while(1)
{
system("cls"); set_cur(0,20); puts(pgmname);
set_cur(6,0); puts("Please enter new data:");
set_cur(10,0); puts(prompt);
set_cur(24,0); printf("%s",buttons);
balken(10, 25, MAXL, ' ',0x70); //input name
if(input(newperson.family_name, MAXL, ESC, CR) == ESC)
return 0;
balken(12,25, MAXL, ' ', 0x70); //surname
if(input(newperson.given_name, MAXL, ESC, CR) == ESC)
return 0;
balken(14,25, 30, ' ', 0x70); //street
if(input(newperson.street, 30, ESC, CR) == ESC)
return 0;
balken(16,25, 4, ' ',0x70); //housenumber
if(input(cache, 4, ESC, CR) == ESC)
return 0;
newperson.house_number = atol(cache); //to string
balken(18,25, 5, ' ',0x70); //postal code
if(input(cache, 5, ESC, CR) == ESC)
return 0;
newperson.postal_code = atol(cache); //to string
balken(20,25, 20, ' ',0x70); //phone number
if(input(cache, 20, ESC, CR) == ESC)
return 0;
newperson.phone = atol(cache); //to string
p = search(newperson.phone);
if( p!= NULL && p->person.phone == newperson.phone)
{
set_cur(22,25);
puts("phonenumber already exists!");
set_cur(24,0); printf("%s, further"); getch();
continue;
}
}
}
5th
/* adress_book_project.c : main program to create an adressbook */
/* copyrights by Oussama Sabri, June 2010 */
#include "adressbook.h" //project header file
int main()
{
int rv, cmd; //return value, user command
if ( (rv = read_file() ) == -1) // no data saved yet
rv = make_entry();
check(rv); //prompts an error and quits program on disfunction
do
{
switch (cmd = menu())//calls menu and gets user input back
{
case '1':
rv = make_entry();
break;
case '2': //delete entry
case '3': //changes entry
rv = change_entry(cmd);
break;
case '4': //prints adressbook on screen
rv = print_adr_book();
break;
case ESC: //end of program
system ("cls"); rv = 0;
break;
}
}while(cmd!= ESC);
check ( write_file() ); //save adressbook
return 0;
}
6th
/* Getcb.c --> Die Funktion getcb() liefert die naechste *
* Tastatureingabe (ruft den BIOS-INT 0x16 auf). *
* Return-Wert: *
* ASCII-Code bzw. erweiterter Code + 256 */
/* Hinweis: Es muss ein DOS-Compiler verwendet werden. *
* (z.B. der GNU-Compiler fuer DOS auf der CD) */
#include <dos.h>
int getcb(void)
{
union REGS intregs;
intregs.h.ah = 0; // Subfunktion 0: ein Zeichen
// von der Tastatur lesen.
int86( 0x16, &intregs, &intregs);
if( intregs.h.al != 0) // Falls ASCII-Zeichen,
return (intregs.h.al); // dieses zurueckgeben.
else // Sonst den erweiterten
return (intregs.h.ah + 0x100); // Code + 256
}
7th
/* PUTCB.C --> enthaelt die Funktionen *
* - putcb() *
* - putcb9() *
* - balken() *
* - input() *
* *
* Es werden die Funktionen 9 und 14 des Video-Interrupts *
* (ROM-BIOS-Interrupt 0x10) verwendet. *
* *
* Die Prototypen dieser Funktionen stehen in BIO.H */
/* Hinweis: Es muss ein DOS-Compiler verwendet werden. *
* (z.B. der GNU-Compiler fuer DOS auf der CD) */
#include <dos.h>
#define VIDEO_INT 0x10
/*----------------------------------------------------------------
* putcb(c) gibt das Zeichen auf der aktuellen Cursor-Position
* am Bildschirm aus. Der Cursor wird versetzt.
* Steuerzeichen Back-Space, CR, LF und BELL werden
* ausgefuehrt.
* Return-Wert: keiner
*/
void putcb(unsigned char c) /* Gibt das Zeichen in c auf */
{ /* den Bildschirm aus. */
union REGS intregs;
intregs.h.ah = 14; /* Subfunktion 14 ("Teletype") */
intregs.h.al = c;
intregs.h.bl = 0xf; /* Vordergrund-Farbe im */
/* Grafik-Modus. */
int86(VIDEO_INT, &intregs, &intregs);
}
/*----------------------------------------------------------------
* putcb9(c,count,mode) gibt das Zeichen in c count-mal im
* angegebenen Modus auf der aktuellen
* Cursor-Position am Bildschirm aus.
* Der Cursor wird nicht versetzt.
*
* Return-Wert: keiner
*/
void putcb9( unsigned char c, /* das Zeichen */
unsigned count, /* die Anzahl */
unsigned mode ) /* Low-Byte: das Atrribut */
{ /* High-Byte: die Bildschirmseite*/
union REGS intregs;
intregs.h.ah = 9; /* Subfunktion 9 des Int 0x10 */
intregs.h.al = c;
intregs.x.bx = mode;
intregs.x.cx = count;
int86( VIDEO_INT, &intregs, &intregs);
}
/*----------------------------------------------------------------
* balken() positioniert den Cursor und zeichnet einen Balken,
* wobei Position, L„nge, Fllzeichen und Attribut
* als Argumente bergeben werden.
* Der Cursor bleibt auf der ersten Position im Balken.
*/
void balken( unsigned int zeile, /* Start-Position */
unsigned int spalte,
unsigned int laenge, /* Laenge des Balkens */
unsigned char c, /* Fuellzeichen */
unsigned int modus) /* Low-Byte: Attribut */
/* High-Byte: Bildschirmseite */
{
union REGS intregs;
intregs.h.ah = 2; /* Cursor auf der angegebenen */
intregs.h.dh = zeile; /* Bildschirmseite versetzen. */
intregs.h.dl = spalte;
intregs.h.bh = (modus >> 8);
int86(VIDEO_INT, &intregs, &intregs);
putcb9(c, laenge, modus); /* Balken ausgeben. */
}
/*----------------------------------------------------------------
* input() liest Zeichen von der Tastatur ein und haengt '\0' an.
* Mit Backspace kann die Eingabe geloescht werden.
* Das Attribut am Bildschirm bleibt erhalten.
*
* Argumente: 1. Zeiger auf den Eingabepuffer.
* 2. Anzahl maximal einzulesender Zeichen.
* 3. Die optionalen Argumente: Zeichen, mit denen die
* Eingabe abgebrochen werden kann.
* Diese Liste muá mit CR = '\r' enden!
* Return-Wert: Das Zeichen, mit dem die Eingabe abgebrochen wurde.
*/
#include <stdarg.h>
int getcb( void); /* Zum Lesen der Tastatur */
int input(char *puffer, int max,... )
{
int c; /* aktuelles Zeichen */
int breakc; /* Abruchzeichen */
int nc = 0; /* Anzahl eingelesener Zeichen */
va_list argp; /* Zeiger auf die weiteren Arumente */
while(1)
{
*puffer = '\0';
va_start(argp, max); /* argp initialisieren */
c = getcb();
do /* Mit Zeichen der Abbruchliste vergleichen */
if(c == (breakc = va_arg(argp,int)) )
return(breakc);
while( breakc != '\r' );
va_end( argp);
if( c == '\b' && nc > 0) /* Backspace? */
{
--nc; --puffer;
putcb(c); putcb(' '); putcb(c);
}
else if( c >= 32 && c <= 255 && nc < max )
{
++nc; *puffer++ = c; putcb(c);
}
else if( nc == max)
putcb('\7'); /* Ton ausgeben */
}
}
8th
/* Video.c --> Enthaelt die Funktionen
* cls(),
* scroll_up(), scroll_down(),
* set_cur(), get_cur(),
* set_screen_page(), get_screen_page()
*
* Die Prototypen dieser Funktionen befinden sich in BIO.H
*/
/* Hinweis: Es muss ein DOS-Compiler verwendet werden. *
* (z.B. der GNU-Compiler fuer DOS auf der CD) */
#include <dos.h>
#include "bio.h"
#define VIDEO_INT 0x10
typedef unsigned char BYTE;
void scroll_up( int anzahl, int anf_zeile, int end_zeile)
{ /* Fenster hoch rollen. */
union REGS intregs;
intregs.x.ax = 0x600 + anzahl; /* Subfunktion AH = 6, */
/* AL = Anzahl Zeilen. */
intregs.x.cx = anf_zeile << 8; /* CH=anf_zeile, cl=0 */
intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
intregs.h.bh = 7; /* normales Attribut */
int86(VIDEO_INT, &intregs, &intregs);
}
void scroll_down( int anzahl, int anf_zeile, int end_zeile)
{ /* Fenster runter rollen. */
union REGS intregs;
intregs.x.ax = 0x700 + anzahl; /* Subfunktion AH = 7, */
/* AL = Anzahl Zeilen. */
intregs.x.cx = anf_zeile << 8; /* CH=anf_zeile, cl=0 */
intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
intregs.h.bh = 7; /* normales Attribut */
int86(VIDEO_INT, &intregs, &intregs);
}
void set_cur( int zeile, int spalte) /* versetzt den Cursor */
{ /* der aktuellen Bildschirmseite.*/
union REGS intregs;
intregs.h.ah = 2;
intregs.h.dh = (BYTE)zeile;
intregs.h.dl = (BYTE)spalte;
intregs.h.bh = (BYTE)get_screen_page();
int86(VIDEO_INT, &intregs, &intregs);
}
void get_cur(int *zeile, int *spalte) /* holt die Cursor- */
{ /* Position der aktuellen Bildschirmseite.*/
union REGS intregs;
intregs.h.ah = 3;
intregs.h.bh = (BYTE)get_screen_page();
int86(VIDEO_INT, &intregs, &intregs);
*zeile = (unsigned)intregs.h.dh;
*spalte = (unsigned)intregs.h.dl;
}
void cls(void)
{
scroll_up(0,0,24); /* Gesamten Bildschirm loeschen. */
set_cur(0,0); /* Cursor in Home-Position. */
}
int get_screen_page(void) /* Aktuelle Bildschirmseite holen.*/
{
union REGS intregs;
intregs.h.ah = 15; /* Subfunktion AH = 15: */
/* Bildschirm-Modus feststellen. */
int86(VIDEO_INT, &intregs, &intregs);
return (intregs.h.bh);
}
void set_screen_page(int seite) /* setzt die aktive Seite des */
{ /* Bildschirmpuffers auf die */
/* angegebene Seite. */
union REGS intregs;
intregs.x.ax = 0x500 + seite; /* Subfunktion AH = 5 */
int86(VIDEO_INT, &intregs, &intregs);
}
/* -------------------------------------------------------------
Ein kleines Testprogramm :
*/
/*
#include <stdio.h>
int main()
{
cls();
set_cur(23, 0); printf("Weiter mit <Return>\n");
set_cur(12, 20); printf("Ein Test!\n");
getchar();
scroll_up(3, 5, 20);
getchar();
scroll_down(6, 5, 20);
getchar();
set_screen_page(1);
printf("\nAuf der 2. Seite !\n");
getchar();
set_screen_page(0);
set_cur(0,0);
printf("\nWieder auf der 1. Seite !\n");
getchar();
cls();
return 0;
}
*/
/* Video.c --> Enthaelt die Funktionen
* cls(),
* scroll_up(), scroll_down(),
* set_cur(), get_cur(),
* set_screen_page(), get_screen_page()
*
* Die Prototypen dieser Funktionen befinden sich in BIO.H
*/
/* Hinweis: Es muss ein DOS-Compiler verwendet werden. *
* (z.B. der GNU-Compiler fuer DOS auf der CD) */
#include <dos.h>
#include "bio.h"
#define VIDEO_INT 0x10
typedef unsigned char BYTE;
void scroll_up( int anzahl, int anf_zeile, int end_zeile)
{ /* Fenster hoch rollen. */
union REGS intregs;
intregs.x.ax = 0x600 + anzahl; /* Subfunktion AH = 6, */
/* AL = Anzahl Zeilen. */
intregs.x.cx = anf_zeile << 8; /* CH=anf_zeile, cl=0 */
intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
intregs.h.bh = 7; /* normales Attribut */
int86(VIDEO_INT, &intregs, &intregs);
}
void scroll_down( int anzahl, int anf_zeile, int end_zeile)
{ /* Fenster runter rollen. */
union REGS intregs;
intregs.x.ax = 0x700 + anzahl; /* Subfunktion AH = 7, */
/* AL = Anzahl Zeilen. */
intregs.x.cx = anf_zeile << 8; /* CH=anf_zeile, cl=0 */
intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
intregs.h.bh = 7; /* normales Attribut */
int86(VIDEO_INT, &intregs, &intregs);
}
void set_cur( int zeile, int spalte) /* versetzt den Cursor */
{ /* der aktuellen Bildschirmseite.*/
union REGS intregs;
intregs.h.ah = 2;
intregs.h.dh = (BYTE)zeile;
intregs.h.dl = (BYTE)spalte;
intregs.h.bh = (BYTE)get_screen_page();
int86(VIDEO_INT, &intregs, &intregs);
}
void get_cur(int *zeile, int *spalte) /* holt die Cursor- */
{ /* Position der aktuellen Bildschirmseite.*/
union REGS intregs;
intregs.h.ah = 3;
intregs.h.bh = (BYTE)get_screen_page();
int86(VIDEO_INT, &intregs, &intregs);
*zeile = (unsigned)intregs.h.dh;
*spalte = (unsigned)intregs.h.dl;
}
void cls(void)
{
scroll_up(0,0,24); /* Gesamten Bildschirm loeschen. */
set_cur(0,0); /* Cursor in Home-Position. */
}
int get_screen_page(void) /* Aktuelle Bildschirmseite holen.*/
{
union REGS intregs;
intregs.h.ah = 15; /* Subfunktion AH = 15: */
/* Bildschirm-Modus feststellen. */
int86(VIDEO_INT, &intregs, &intregs);
return (intregs.h.bh);
}
void set_screen_page(int seite) /* setzt die aktive Seite des */
{ /* Bildschirmpuffers auf die */
/* angegebene Seite. */
union REGS intregs;
intregs.x.ax = 0x500 + seite; /* Subfunktion AH = 5 */
int86(VIDEO_INT, &intregs, &intregs);
}
/* -------------------------------------------------------------
Ein kleines Testprogramm :
*/
/*
#include <stdio.h>
int main()
{
cls();
set_cur(23, 0); printf("Weiter mit <Return>\n");
set_cur(12, 20); printf("Ein Test!\n");
getchar();
scroll_up(3, 5, 20);
getchar();
scroll_down(6, 5, 20);
getchar();
set_screen_page(1);
printf("\nAuf der 2. Seite !\n");
getchar();
set_screen_page(0);
set_cur(0,0);
printf("\nWieder auf der 1. Seite !\n");
getchar();
cls();
return 0;
}
*/
/* BIO.H --> Enthaelt die Prototypen der BIOS-Funktionen. */
/* --- Funktionen in VIDEO.C --- */
extern void scroll_up(int anzahl, int anf_zeile,int end_zeile);
extern void scroll_down(int anzahl, int anf_zeile, int end_zeile);
extern void set_cur(int zeile, int spalte);
extern void get_cur(int *zeile, int *spalte);
extern void cls(void);
extern int get_screen_page(void);
extern void set_screen_page(int page);
/* --- Funktionen in GETCB.C / PUTCB.C --- */
extern int getcb(void);
extern void putcb(int c);
extern void putcb9(int c, unsigned count, unsigned modus);
extern void balken(int zeile, int spalte, int laenge, int c, unsigned modus);
extern int input(char *puffer, int max,... );
need your help, can't find my mistakes:((