Неправильное чтение двоичных файлов - PullRequest
0 голосов
/ 07 мая 2019

Я новичок в C и пытаюсь читать и записывать структуры в файл .dat. Когда я добавляю данные, я вижу символы в файле .dat. Однако я не могу прочитать данные, и мой код ничего не выводит, когда он должен выводить «val» для каждого вхождения структуры.

Я просмотрел множество источников, но не могу найти, как мой код отличается от них.

https://www.geeksforgeeks.org/readwrite-structure-file-c/ Этот веб-сайт был использован для первоначального понимания, как это сделать.

Чтение / запись в двоичные файлы в C Я использовал это, чтобы увидеть, как можно исправить мой код, но решение не помогло.

Я попытался изменить оператор в цикле while.

struct person
{
    int id;
    char lastName[15];
    char firstName[15];
    char age[4];
};


int main(void) {
  //create new file
  FILE *fp = fopen("file.dat", "wb+");

  struct person a = {10, "Smith", "John", 25};
  fwrite(&a, sizeof(a), 1, fp);

  struct person b = {2, "Ali", "Jon", 12};
  fwrite(&b, sizeof(b), 1, fp);

 struct person c = {19, "Walter", "Martha", 82};
  fwrite(&c, sizeof(c), 1, fp);

  struct person p; 
  while(fread(&p, sizeof(p), 1, fp))
  printf("val");
}

В настоящее время должно быть напечатано 3 "Vals", поскольку в файл данных добавлено три человека. Однако ничего не печатается.

Я ценю помощь.

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Когда вы закончите запись записей, указатель файла («курсор», позиция, которую вы читаете / пишете) находится в конце файла.Вы должны установить эту позицию обратно в начало файла, используя rewind(), fseek() или fsetpos() перед попыткой чтения из файла.

0 голосов
/ 07 мая 2019

Если вы хотите прочитать обратно и распечатать, попробуйте зафиксировать начальную позицию файла перед записью файла с помощью fpos_t и fgetpos(). Позже, после записи в файл, установите исходную позицию, используя fsetpos(), и используйте fget(), чтобы прочитать содержимое и распечатать его. Проверьте измененный код, как показано ниже -

#include<stdio.h>
#include<stdlib.h>

struct person
{
    int id;
    char lastName[15];
    char firstName[15];
    char age[4];
};


int main(void) {
  //create new file
  FILE *fp = fopen("file.dat", "wb+");
  fpos_t position;


  struct person a = {10, "Smith", "John", "25"};
  fwrite(&a, sizeof(a), 1, fp);

  struct person b = {2, "Ali", "Jon", "12"};
  fwrite(&b, sizeof(b), 1, fp);

  struct person c = {19, "Walter", "Martha", "82"};
  fwrite(&c, sizeof(c), 1, fp);

  fseek(fp, 0, SEEK_SET);

  struct person p; 
  while(fread((void *)&p, sizeof(p),1,fp)==1)
  {
    printf("%d\n",p.id);
    printf("%s\n",p.lastName);
    printf("%s\n",p.firstName);
    printf("%s\n",p.age);    
    printf("\n");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...