как хранить и читать данные из файлов - PullRequest
0 голосов
/ 02 сентября 2011

Я новичок в C в Linux. Я пытаюсь сохранить данные в файл и прочитать их обратно. Это правильный путь. Когда я пытаюсь скомпилировать это, я получаю ошибки. Кто-нибудь может мне помочь. заранее спасибо.

 #include<stdio.h>
       typedef struct
    {
      int select;
      char lastname[25];
      char firstname[25];
      char address[25];
      char phonenumber[25];
    } addressbook;

    addressbook a[5];
     FILE *fp;
    int main()
    {
      int i;

     for( i=0; i<5 ; i++)
    {
     printf("enter details\n");
       printf("enter lastname:\n");
       scanf("%s", a[i].lastname);
       printf("enter firstname:\n");
       scanf("%s", a[i].firstname);
       printf("enter address:\n");
       scanf("%s", a[i].address);
       printf("enter phone number:\n");
       scanf("%s", a[i].phonenumber);
      fp = fopen("addressbook.dat","a+");
      fwrite(&a, sizeof(a), 1, fp);
      fclose(fp);
    }

    for(i=0; i<5; i++)
    {
      fopen("addressbook.dat", "r");
      fread(&a, sizeof(a), 1, fp );
      printf("lastname:%s\n", a[i].lastname);
      printf("firstname:%s\n", a[i].firstname);
      printf("address:%s\n", a[i].address);
      printf("phonenumber:%s\n", a[i].phonenumber);
      fclose(fp);
    }
    return 0;
    }

Я не получаю вывод. это было пусто.

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Мне кажется, что вы не включаете требуемые заголовки. Например, printf требует stdio.h, поэтому в начале для вашего файла вам понадобится

#include <stdio.h>

CPlusPlus.com предоставляет довольно хорошую и простую для поиска документацию по C, поэтому, если вы хотите использовать функцию, вы можете найти ее и выяснить, какой заголовок необходим.

0 голосов
/ 02 сентября 2011

Проверьте этот код, и позвольте мне объяснить вам, что все было не так в вашем коде.

    #include<stdio.h>

    typedef struct
    {
          int select;
          char lastname[25];
          char firstname[25];
          char address[25];
          char phonenumber[25];
    } addressbook;

    #define ARRAYLEN 2

    addressbook a[ARRAYLEN];
    FILE *fp;

    int main()
    {
         int i;

         fp = fopen("addressbook.dat","a+");

         for( i=0; i<ARRAYLEN ; i++)
         {
           printf("enter details\n");
           printf("enter lastname:\n");
           scanf("%s", a[i].lastname);
           printf("enter firstname:\n");
           scanf("%s", a[i].firstname);
           printf("enter address:\n");
           scanf("%s", a[i].address);
           printf("enter phone number:\n");
           scanf("%s", a[i].phonenumber);
           fwrite(&a[i], sizeof(a), 1, fp); /* notice, array indexed */
        }
        fclose(fp);

        fopen("addressbook.dat", "r");
        for(i=0; i<ARRAYLEN; i++)
        {
          fread(&a[i], sizeof(a), 1, fp );
          printf("lastname:%s\n", a[i].lastname);
          printf("firstname:%s\n", a[i].firstname);
          printf("address:%s\n", a[i].address);
          printf("phonenumber:%s\n", a[i].phonenumber);
        }
        fclose(fp);

        return 0;
    }

На самом деле, ваш код как есть (кроме уже отредактированного вами редактирования) не так уж и некорректен, но в нем есть некоторые небольшие, но важные недостатки.

  1. Единственное реальное изменение заключается в следующем: -

    fwrite(&a[i],...
    

    и

    fread(&a[i],...
    

    т.е. передать адрес конкретного элемента массива, который вы хотите записать, а не весь массив. Кроме того, даже если вы передавали адрес всего массива, нет. байт / символов, которые вы просили библиотеку написать, был просто sizeof (структура), поэтому, по сути, оставшиеся были усечены. Без этого то, что вы записывали в файл, было что-то вроде ...

    A          <-- file contents after, first iteration
    AAB        <-- file contents after, second iteration
    AABABC     <-- file contents after, third iteration
    AABABCABCD <-- file contents after, fourth iteration
    ....
    

    Думаю, из этого вы поймете, что было не так. Кроме того, содержимое вашего addressbook.dat было текстовым, поэтому простой «cat addressbook.dat» (в Linux) сказал бы вам, что не так: -)

  2. Вы открываете и закрываете файл на каждой итерации. Теперь это не ошибка, а просто неоптимальная вещь, и вполне вероятно, что вы не хотите этого делать. Файловые операции являются дорогостоящими, а их открытие / закрытие стоит довольно много циклов ЦП. Вам лучше открыть файл один раз для всех записей и один раз для чтения. (Конечно, однажды можно удалить fclose (), выполненную после write-block, и fopen (), выполненную также и перед read-block, просто получив указатель файла на начало файла - оставленный для вас как упражнение).

  3. Во время тестирования никто не хочет вводить столько данных. Поэтому я добавил #define (и с более новым компилятором вы также можете заменить его определением const), который определяет макрос, который содержит размер массива адресной книги. Для тестирования я держу его в «2». Для производства вы можете просто изменить это значение на «1000», и оно все равно будет работать. Опять же, это не ошибка, просто лучший стиль, если хотите.

  4. Да, и кстати, пожалуйста, сделайте ваш отступ правильно. Вы пришли из мира Python? Или это может быть артефакт того отступа, который необходим SO для размещения кодовых блоков.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...