Advertisement
xeritt

Чтение/запись структуры в bin файл

Apr 8th, 2018
154
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define NAME_LEN 20
  5. #define NUM_LEN 20
  6.  
  7. struct phone{
  8.     int group;
  9.     char name[NAME_LEN];
  10.     char num[NUM_LEN];
  11. };
  12.  
  13. typedef struct phone phones;
  14.  
  15. FILE * open_file(char *name, char *mode) {
  16.     FILE *fp;
  17.     if ((fp = fopen(name, mode)) == NULL) {
  18.         printf("Не удается открыть файл %s.\n", name);
  19.         exit(1);
  20.     }
  21.     return fp;
  22. }
  23.  
  24. void close_file(FILE *fp) {
  25.     if (fclose(fp)) {
  26.         printf("Ошибка при закрытии файла.\n");
  27.         exit(1);
  28.     }
  29. }
  30.  
  31. void read_phones(FILE *fp) {
  32.     phones ph;
  33.     int size = sizeof (phones);
  34.     while (!feof(fp)) {
  35.         memset(ph.name, '\0', NAME_LEN);
  36.         memset(ph.num, '\0', NUM_LEN);
  37.         if (fread(&ph, size, 1, fp) == 1) {
  38.             printf("Group:%d ", ph.group);
  39.             printf("Name:%s ", ph.name);
  40.             printf("Num:%s\n", ph.num);
  41.         }
  42.     }
  43. }
  44.  
  45. void write_phone(FILE *fp, char *argv[]) {
  46.     phones ph;
  47.     ph.group = atoi(argv[2]);
  48.     memset(ph.name,'\0', NAME_LEN);
  49.     memset(ph.num,'\0', NUM_LEN);
  50.     strcpy(ph.name, argv[3]);
  51.     strcpy(ph.num, argv[4]);
  52.     fwrite(&ph, sizeof(phones), 1, fp);
  53. }
  54.  
  55. int main(int argc, char **argv)
  56. {
  57.     FILE *fp;
  58.     if (argc < 2) {
  59.         fprintf(stderr, "Мало аргументов. Используйте для чтения <имя файла>\n");
  60.         fprintf (stderr, "Используйте для записи <имя файла> <group> <name> <num>\n");
  61.         exit(1);
  62.     } else if(argc ==2){
  63.         fp = open_file(argv[1], "rb");
  64.         read_phones(fp);
  65.         close_file(fp);
  66.     } else if (argc < 5 ) {
  67.         fprintf (stderr, "Мало аргументов. Используйте <имя файла> <group> <name> <num>\n");
  68.         exit (1);
  69.     } else if(argc == 5){
  70.         fp = open_file(argv[1], "ab");
  71.         write_phone(fp, argv);
  72.         close_file(fp);
  73.     } if (argc > 5){
  74.         fprintf (stderr, "Много аргументов. Используйте <имя файла> <group> <name> <num>\n");
  75.         exit (1);
  76.     }
  77.     return 0;
  78. }
Advertisement
RAW Paste Data Copied
Advertisement