⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strucfil.c

📁 国外网站上的一些精典的C程序
💻 C
字号:
/******************************************************************* * Generic structure <> disk file manipulations. These functions * form a basic template for reading and writing structures to a  * sequential file. This template is probably most useful for files * with 500 or less records and eliminates the need for a more  * elaborate file handler such as C-Tree, DB-Vista, Mix etc. * Routines to put data in the struct is out of scope here. * Written by Lynn Nash 8/28/91 and donated to the public domain. */#include <io.h>#include <string.h>#include <stdlib.h>#include "sniptype.h"#include "strucfil.h" /*-------------------- general globals ---------------------*/static long cur_rec = 0;      /* the current record number */static FILE *fsptr = NULL;    /* fixed record data file pointer */ /* if file exists open in read/write mode else create file */FILE * open_file(char *filename){      if (access(filename, 0) == 0)            fsptr = fopen(filename, "rb+");       else  fsptr = fopen(filename, "wb+");       return fsptr;                       /* return the file pointer */}  /* add new records to the data file */int datadd(void){      if (fsptr)      {            if (fseek(fsptr, 0L, SEEK_END) != 0)                  return Error_;  /* seek failure */            rec.delete_flag = 0; /* active record tag */            rec.recordnum = (int) (ftell(fsptr) /                   (long) sizeof(struct blackbook));            if (fwrite(&rec, sizeof(struct blackbook), 1, fsptr) != 1)            {                  return Error_; /* write error */            }            else            {                  /* put your clean up code here */                   return Success_;            }      }      return Error_;}/* tag the last record read in the file as deleted */int data_delete(void){      if (fsptr)      {            if (fseek(fsptr, (long) sizeof(struct blackbook) * -1L,                  SEEK_CUR) != 0)            {                  return Error_;            }            rec.delete_flag = -1;   /* tag the record as deleted */            if (fwrite(&rec, sizeof(struct blackbook), 1, fsptr) != 1)                  return Error_;            else  return Success_;      }      return Error_;}/* read a random structure. If successful the global cur_rec will  * contain the number of the last record read & it can be compared * to the number in the struct as a double check (belt & suspenders) */int data_read(long recnum){      if (fseek(fsptr, (long) sizeof(struct blackbook) * recnum,            SEEK_SET) != 0)      {            return Error_;      }      cur_rec = recnum; /* keep tabs on record pointer in global */        /* now read the record into save struct*/      if (fread(&oldrec, sizeof(struct blackbook), 1, fsptr) != 1)      {            return Error_;      }      else                          /* copy save struct to edit struct */      {            memcpy(&rec, &oldrec, sizeof(struct blackbook));            return Success_;      }} /* rewrite the last read record back to disk */int data_update(void){      if (memcmp(&rec, &oldrec, sizeof(struct blackbook)) == 0)            return True_;  /* no update needed */      /* back up one record before writing */      if (fseek(fsptr, (long) sizeof(struct blackbook) * -1L,             SEEK_CUR) != 0)      {            return Error_; /* seek error */       }      /* now write the record */      if (fwrite(&rec, sizeof(struct blackbook), 1, fsptr) != 1)            return Error_; /* write error */      return Success_;}/* get the next valid record in the file */int read_forward(void){      do      {            cur_rec++; /* upcount the record number */            if (data_read(cur_rec) != 0)            {                  cur_rec--; /* decrement the record number */                  return Error_;            }      } while (oldrec.delete_flag != 0); /* record read was deleted */      return Success_;}/* get the previous valid record in the file */int read_backward(void){      do      {            cur_rec--;  /* decrement the record number */            if (cur_rec >= 0)            {                  if ( data_read(cur_rec) != 0 )                  {                        cur_rec++; /* increment the record number */                        return Error_;                  }            }        } while (oldrec.delete_flag != 0); /* record read was deleted */      return Success_;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -