NoWeDoR
Cool Çırak
Arkadaşlar aşağıdaki programı çalıştırdıktan sonra ana menüden 1 girerek bir adet kayıt alıyorum kullanıcıdan. Atıyorum ad q soyad q numara 123123 olarak girilsin.
Daha sonra delete fonksiyonunu kullanarak (ana menüden 5 girerek) bu girdiğim kaydı silmek için oraya tekrar atama yapmak istiyorum. (Ad, soyad ve numara 0 degerine ya da NULL değerine eşit olsun diye uğraşıyorum) Ancak ne denediysem atamayı delete fonksiyonu içersinde bir türlü yapamadım. Kod satırlarında ((( deletE() fonksiyonunda ))) yaptığım atamalara (// olarak yorum satırlarında) bakabilirsiniz.
Acaba nasıl atama yapılmalı ?
Daha sonra delete fonksiyonunu kullanarak (ana menüden 5 girerek) bu girdiğim kaydı silmek için oraya tekrar atama yapmak istiyorum. (Ad, soyad ve numara 0 degerine ya da NULL değerine eşit olsun diye uğraşıyorum) Ancak ne denediysem atamayı delete fonksiyonu içersinde bir türlü yapamadım. Kod satırlarında ((( deletE() fonksiyonunda ))) yaptığım atamalara (// olarak yorum satırlarında) bakabilirsiniz.
Acaba nasıl atama yapılmalı ?
Kod:
#include <stdlib.h> // "stdlib" library contains of exit() function
#include <malloc.h> // "malloc" library contains of malloc() function
#include <Windows.h> // "Windows" library contains of Sleep() function which waits the system as you want
#include <io.h> // "io" library contains of filelength() function
#include <string.h> // "string" library contains of strlen() function
#include <stdio.h> // "stdio" library contains of other functions which hasn't been mentioned
typedef struct personKnowledge // Structe and it's elements are being defined
{
char name[32];
char surname[32];
char number[32];
};
FILE *ptrFILE, *ptrFILE1; // Variables are being defined
long int recordLength, totalRecordLength, location;
int choice, number, totalRecordNumber, i;
static int counter = 0;
int menu(); // Functions are being defined
void newRecord();
void display();
void update();
void add();
void deletE();
int main() // Program is being initialiezed
{
menu();
return 0;
}
int menu() // Options are being presented to user
{
do
{
printf("\n\t\t --- Phone Book Program ---");
printf("\n\n\t\t 1) Open file and record someone");
printf("\n\n\t\t 2) Display person knowledge");
printf("\n\n\t\t 3) Update person knowledge");
printf("\n\n\t\t 4) Add person to list");
printf("\n\n\t\t 5) Delete someone");
printf("\n\n\t\t 6) Exit");
printf("\n\n\nEnter your choice: ");
choice = 0;
scanf("%d", &choice);
fflush(stdin);
switch (choice)
{
case 1:
{
newRecord();
break;
}
case 2:
{
display();
break;
}
case 3:
{
break;
}
case 4:
{
break;
}
case 5:
{
deletE();
break;
}
case 6:
{
printf("\nWorking has been completed.\n");
return 0;
}
default:
{
printf("\nWrong entry! The program has been terminated.\n");
break;
}
}
} while (choice >= 1 && choice <= 6);
}
void newRecord() // This function opens a file and records one person in file
{
if (counter > 0)
{
system("cls"); // Screen is being cleaned
Sleep(350); // Sleep functions waits user for a while
printf("\nYou have already entered '1' and opened a file. To add a person please enter '4'\n");
return;
}
else
{
if ((ptrFILE = fopen("Phone Book.dat", "wb")) == NULL) // wb is binary writing mode
{
printf("The file couldn't be opened\n");
exit(EXIT_SUCCESS);
}
system("cls");
Sleep(350);
personKnowledge *p; // p = (Person)
p = (personKnowledge *)malloc(sizeof(personKnowledge)); // Memory is being allocated
fflush(stdin); // Cache memory is being cleaned
recordLength = sizeof(*p);
printf("\n\Express person name: "); // User is entering the person's knowledge and they are being saved in file
fgets(p->name, sizeof(p->name), stdin);
size_t wordLength = strlen(p->name); // "size_t is unsigned integer type"
if (wordLength > 0 && p->name[wordLength - 1] == '\n') // This if idiom has been used for sentence seperation
{
p->name[--wordLength] = '\0';
}
printf("Express %s's surname: ", p->name);
fgets(p->surname, sizeof(p->surname), stdin);
printf("Express %s's number: ", p->name);
fgets(p->number, sizeof(p->number), stdin);
fwrite(&(*p), recordLength, 1, ptrFILE); // Knowledge which has been got from user is being saved in file processionally
printf("\nPlease wait, information is saving to file..\n");
Sleep(750);
printf("*-* Saving operation has been completed succesfully. *-*\n");
free(p); // Allocated part of memory is being released
}
fclose(ptrFILE); // File is being closed
counter++;
}
void display() // If there is person knowledge which is searched in file, this function reads it and prints on the screen
{
if ((ptrFILE = fopen("Phone Book.dat", "rb")) == NULL) // rb is binary reading mode
{
printf("The file couldn't be opened\n");
exit(EXIT_SUCCESS);
}
system("cls");
Sleep(350);
personKnowledge *s; // s = (Searching)
s = (personKnowledge *)malloc(sizeof(personKnowledge));
recordLength = sizeof(*s); // Necessary location calculations are being done and person's knowledge is being displayed
totalRecordLength = filelength(fileno(ptrFILE)); // The equalities explains what the purpose is from 137th line to 145th line
totalRecordNumber = totalRecordLength / recordLength;
printf("\n\nExpress person record number which you search: ");
number = -791673918435;
scanf("%d", &number);
fflush(stdin);
printf("\n*-* Person knowledge which you search *-*\n");
Sleep(750);
location = (number - 1)*(recordLength);
fseek(ptrFILE, location, SEEK_SET); // The cursor locates place which is searched with fseek() function
if (fread(&(*s), recordLength, 1, ptrFILE) != 0 && number > 0) // If there is knowledge in that location and numbeer is greater than 0
{
printf("Name: %s\n", s->name);
printf("Surname: %s", s->surname);
printf("Number: %s", s->number);
}
else
{
printf("There is no record like this.\n");
return;
}
free(s);
fclose(ptrFILE);
}
void deletE()
{
if ((ptrFILE = fopen("Phone Book.dat", "rb+")) == NULL)
{
printf("The file couldn't be opened\n");
exit(EXIT_SUCCESS);
}
system("cls");
Sleep(350);
personKnowledge *del; // del = (Deleting)
del = (personKnowledge *)malloc(sizeof(personKnowledge));
fflush(stdin);
recordLength = sizeof(*del);
totalRecordLength = filelength(fileno(ptrFILE));
totalRecordNumber = totalRecordLength / recordLength;
printf("\nExpress person number which you want to delete: ");
scanf("%d", &number);
fflush(stdin);
fseek(ptrFILE, (number-1)*recordLength, SEEK_SET);
if (fread(&(*del), recordLength, 1, ptrFILE) != 0 && number > 0) // If there is knowledge in that location and number is greater than 0
{
Sleep(350);
printf("*-* The record which is cleaned *-* \n", number);
printf("Name: %s\n", del->name);
printf("Surname: %s", del->surname);
printf("Number: %s", del->number);
// del->name = ""; <<<<<<<<<<<<<<<<<< :( ?? ?? ??? ?
// del->name = {}; <<<<<<<<<<<<<<<<<< :( ? ? ?? ?? ?
// &(*del).name = ""; <<<<<<<<<<<<<<<<<< :( ? ? ? ?? ? ? ??
// &(*del).name = {}; <<<<<<<<<<<<<<<<<< :( ?? ?? ? ??
// strcpy(del->name, ""); <<<<<<<<<<<<<<<<<< :( ??? ? ?? ?? ?
// del->name = NULL; <<<<<<<<<<<<<<<<<< :( ??? ? ?? ? ? ?
// strcpy(del->name, NULL); <<<<<<<<<<<<<<<<<< :( ?? ?? ? ??
}
else
{
Sleep(350);
printf("There is no record like this.\n");
return;
}
fclose(ptrFILE);
free(del);
}