C 언어 간단 한 전자 주소록 실현(2)

15648 단어 C 언어통신 록
본 논문 의 사례 는 C 언어 가 간단 한 전자 주소록 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
이틀 동안 시스템 호출 과 표준 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; }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기