C 언어 간단 한 전자 주소록 실현(2)
이틀 동안 시스템 호출 과 표준 IO 를 배 웠 습 니 다.이전의 주소록 은 개선 을 해서 데 이 터 를 파일 에 저장 할 수 있 습 니 다.(그림 은 제 가 보 내지 않 겠 습 니 다.)
원리:프로그램 을 시작 할 때마다 미리 설 정 된 파일 에서 저 장 된 주소록 정 보 를 읽 고 읽 은 정 보 를 구조 체 에 가 져 옵 니 다.종료 할 때마다 미리 설 정 된 파일 을 업데이트 방식 으로 열 고 파일 에 저 장 된 정 보 를 비 운 다음 구조 체 의 데 이 터 를 파일 에 저장 한 다음 프로그램 을 종료 합 니 다.
또한 파일 을 기록 할 때 와 읽 을 때 데 이 터 를 저장 하 는 총 개 수 를 먼저 기록(읽 기)하고 프로그램 이 얼마나 많은 데 이 터 를 기록(읽 기)해 야 하 는 지 알 게 한 다음 에 모든 데이터 의 바이트 수(프로그램 은 각 데이터 의 바이트 수 에 따라 저장 합 니 다)를 저장 한 다음 에 데 이 터 를 저장 합 니 다.
이전 버 전에 비해 주 함수 에 파일 읽 기와 데 이 터 를 기록 하 는 두 단계 만 추가 되 었 습 니 다.또 다른 변동 은 구조 체 가 하나 에서 두 개 로 바 뀌 었 고 지침 을 원래 구조 체 에서 분리 하여 데 이 터 를 파일 에서 가 져 와 내 보 낼 수 있 도록 하 는 것 입 니 다.다음은 코드 입 니 다.
헤더 파일 head.h 에서 유일 하 게 수 정 된 것 은 구조 체 입 니 다.
#ifndef HEAD_H_
#define HEAD_H_
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h> // sleep
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define uint unsigned int
#define OK 0
#define ERROR -1
#define MALLOC_ERROR -2
#define N 20
typedef int ElementType;
typedef struct data
{
ElementType ID; // ID
char Name [N]; //
char Mobile_Phone [N]; //
char Home_Address [N]; //
char Company_Tell [N]; //
}Data;
typedef struct _Node
{
Data data;
struct _Node* next; //
}Node;
typedef Node* PNode; //
//
int Interface_Display ();
// ( )
int Add_Friend (PNode head, ElementType num);
//
int Friend_Information (PNode head);
//
int Search_Friend (PNode head, char* Name);
//
void Delete_Friend (PNode head, char* Name);
#endif
원본 파일 head.c 구조 체 부분 수정
#include "head.h"
//
int Interface_Display ()
{
system ("clear");
printf ("\t*****************************************
");
printf ("\t~ ~
");
printf ("\t~ ~
");
printf ("\t~ 1 >>>>>>>> ~
");
printf ("\t~ 2 >>>>>>>> ~
");
printf ("\t~ 3 >>>>>>>> ~
");
printf ("\t~ 4 >>>>>>>> ~
");
printf ("\t~ 5 >>>>>>>> ~
");
printf ("\t~ ~
");
printf ("\t~ ~
");
printf ("\t~ :believe ~
");
printf ("\t*****************************************
");
printf ("
");
printf ("
");
printf ("\t :");
}
// ( )
int Add_Friend (PNode head, ElementType num)
{
if (NULL == head)
{
return ERROR;
}
//
PNode p = (PNode) malloc(sizeof(Node)/sizeof(char));
if (NULL == p)
{
return MALLOC_ERROR;
}
//
system("clear");
printf ("\t************* ***************
");
p->data.ID = num;
printf ("\t ID :%d
", p->data.ID);
printf ("
");
printf ("\t :");
scanf ("%s", p->data.Name);
printf ("
");
printf ("\t :");
scanf ("%s", p->data.Mobile_Phone);
printf ("
");
printf ("\t :");
scanf ("%s", p->data.Home_Address);
printf ("
");
printf ("\t :");
scanf ("%s", p->data.Company_Tell);
printf ("
");
p->next = NULL;
//
PNode Ptmp; // Ptmp
Ptmp = head;
while (Ptmp->next)
{
Ptmp = Ptmp->next;
}
Ptmp->next = p;
return OK;
}
//
int Friend_Information (PNode head)
{
if (NULL == head)
{
return ERROR;
}
PNode p = head->next;
printf ("\tID\t \t\t \t\t \t\t\t
");
while (p)
{
printf ("\t%d\t%s\t\t%s\t\t%s\t\t\t%s
", p->data.ID, p->data.Name,p->data.Mobile_Phone, p->data.Home_Address, p->data.Company_Tell);
p = p->next;
}
putchar('
');
return OK;
}
//
int Search_Friend (PNode head, char* Name)
{
PNode p = head;
PNode q = NULL;
if ((NULL != p) && NULL != (p->next))
{
while (p->next)
{
q = p->next;
if ((NULL != q) && 0 == (strcmp(q->data.Name, Name)))
{
printf ("\t :
\tID:%d
\t : %s
\t : %s
\t :%s
\t : %s
", q->data.ID, q->data.Name, q->data.Mobile_Phone, q->data.Home_Address, q->data.Company_Tell);
}
else
{
printf ("\t , !
");
}
p = p->next;
}
}
/*
if (NULL == head)
{
return ERROR;
}
PNode p;
int flag = 1;
for (p = head->next; p != NULL; p = p->next)
{
if (0 == strcmp(p->data.Name, Name))
{
flag = 0;
printf ("\t :
\tID: %d
\t : %s
\t : %s
\t : %s
\t : %s
", p->data.ID, p->data.Name, p->data.Mobile_Phone, p->data.Home_Address, p->data.Company_Tell);
}
}
fi (flag)
{
printf ("\t , !
");
}
putchar('
');
*/
return OK;
}
//
void Delete_Friend (PNode head, char* Name)
{
PNode p = head;
PNode q = NULL;
while (NULL != p && NULL != (p->next))
{
q = p->next;
if (NULL != q && 0 == strcmp(q->data.Name, Name))
{
p->next = q->next;
free(q);
int j;
printf ("\t
");
printf ("\t ");
fflush (stdout); // ,
for (j = 0; j < 2; j++)
{
sleep (1); //linux sleep,
printf (".");
fflush(stdout); // ,
}
printf ("
");
printf ("\t !
");
}
else if (NULL == q->next && 0 != strcmp(q->data.Name, Name))
{
printf ("\t !
");
}
p = p->next;
}
}
주 함수 main.c 에 데이터 읽 기와 쓰기 가 추가 되 었 습 니 다.표시 되 어 있 습 니 다.
/*******************************************************************
: , ID 、 ( )、
, , 。
:
: ,A) B) 。(
) C) D)
A) INSERT , 。
B) DISPLAY ,
C) SEARCH , 。
。 ,
D) DELETE , ,
, , , ID
。
**********************************************************************/
#include "head.h"
int main ()
{
int Function;
int i = 0;
char Name[N];
int cho;
//
PNode head_node = (PNode) malloc(sizeof(Node)/sizeof(char));
if (NULL == head_node)
{
return MALLOC_ERROR;
}
head_node->next = NULL;
/****************************************************************
****************************************************************/
// ,
FILE *fp1 = fopen ("student.txt", "r+");
if (NULL == fp1)
{
printf ("fopen");
return -1;
}
PNode tmp = head_node;
int count;
int ret;
// , ,
// 0
ret = fread (&count, sizeof(int), 1, fp1);
if(ret != 0)
{
for (i = 0; i < count; i++)
{
//
Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));
int len;
fread (&len, sizeof(int), 1, fp1); //
fread (&(node->data), len, 1, fp1); //
node->next = NULL;
while (tmp->next) //
{
tmp = tmp->next;
}
tmp->next = node; //
}
}
if (ret == 0 && !feof(fp1)) //
{
perror ("fread");
return -1;
}
fclose (fp1); //
/****************************************************************
,
****************************************************************/
i = 1; // i (i ID )
while (1)
{
Interface_Display (); //
scanf ("%d", &Function);
switch (Function) //
{
case 1: //
{
Function = 0;
Add_Friend (head_node, i++);
int j;
printf ("\t
");
printf ("\t ");
fflush (stdout); // ,
for (j = 0; j < 2; j++)
{
sleep (1); // Linux sleep,
printf (".");
fflush (stdout); // ,
}
printf ("
");
printf ("\t !
");
printf ("\t 1:");
scanf ("%d", &cho);
if (1 == cho)
{
break;
}
else
{
printf ("\t ! ! :");
scanf ("%d", &cho);
break;
}
break;
}
case 2: //
{
system ("clear");
printf ("\t*********** ******************
");
printf ("
");
Friend_Information (head_node);
Function = 0;
printf ("\t 1:");
scanf ("%d", &cho);
if (1 == cho)
{
break;
}
else
{
printf ("\t ! ! :");
scanf ("%d", &cho);
break;
}
break;
}
case 3: //
{
system ("clear");
printf ("\t************* *************
");
printf ("\t :");
scanf ("%s", Name);
printf ("
");
int j;
printf ("\t
");
printf ("\t ");
fflush (stdout); // ,
for (j = 0; j < 2; j++)
{
sleep (1); // Linux sleep,
printf (".");
fflush (stdout); // ,
}
printf ("
");
Search_Friend (head_node, Name);
printf ("\t 1:");
scanf ("%d", &cho);
if (1 == cho)
{
break;
}
else
{
printf ("\t ! ! :");
scanf ("%d", &cho);
break;
}
break;
}
case 4: //
{
system ("clear");
printf ("\t************* *************
");
printf ("\t :");
scanf ("%s", Name);
printf ("
");
Delete_Friend (head_node, Name);
printf ("\t 1:");
scanf ("%d", &cho);
if (1 == cho)
{
break;
}
else
{
printf ("\t ! ! :");
scanf ("%d", &cho);
break;
}
break;
}
case 5: //
{
/****************************************************************
,
****************************************************************/
// ( )
FILE *fp2 = fopen ("student.txt", "wb+");
if(NULL == fp2)
{
printf ("fopen");
return -1;
}
tmp = head_node->next; // tmp
count = 0; //
while(tmp) //
{
count++;
tmp = tmp->next;
}
//
fwrite(&count, sizeof(int), 1, fp2);
tmp = head_node; // tmp
while (tmp->next)
{
Node* p = tmp->next;
tmp->next = p->next;
//
int len = sizeof(p->data);
fwrite (&len, sizeof(int), 1, fp2);
//
fwrite (&(p->data), sizeof(Data), 1, fp2);
free (p);
}
fclose (fp2);
/****************************************************************
,
****************************************************************/
Function = 0;
system ("clear");
exit (0);
}
default: //
{
Function = 0;
printf ("\t ! ! :");
scanf ("%d", &Function);
break;
}
}
}
return 0;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.