Чтение содержимого структуры с помощью системного вызова read () - PullRequest
0 голосов
/ 28 марта 2011
#include "common.h"
#include <string.h>

struct buffer
{
   int no;
   char name[20];
};

int main()
{
   struct buffer buf;
   struct buffer read_buf;
   int fd;

   if((fd = open("read_write.txt",O_CREAT|O_RDWR,S_IRUSR|S_IWUSR)) < 0)
   {
      PRINT_ERROR(errorbuf);
   }

   buf.no = 10;
   strcpy(buf.name,"nitin");

   if(write(fd, &buf, sizeof(struct buffer)) < 0)
   {
      PRINT_ERROR(errorbuf);
   }

   printf("Written successfully\n");

   /* Add code here to read the content of the structure into 'read_buf' */

   exit(0);
}

common.h

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

char errorbuf[20];

#define PRINT_ERROR(errorbuf) \
   do \
   { \
      sprintf(errorbuf,"%s:%d",__FILE__,__LINE__); \
      perror(errorbuf); \
      exit(-1); \
   }while(0);

Я записал структуру в файл. Но я запутался в том, как извлечь каждый элемент структуры, записанный ранее, в объект read_buf. Пожалуйста, скажите мне, как это сделать.

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 марта 2011
lseek(fd,0,SEEK_SET);
read(fd,&buf,sizeof(struct buffer);

Будет работать, но есть некоторые другие вещи, о которых вам придется беспокоиться.

  • Это не портативный.
  • Вам придется беспокоиться о структуре упаковки на разных сборках.
  • У вас будут кросс-платформенные проблемы с порядком байтов.
  • Windows вам может понадобиться O_BINARY.

Почти всегда лучше переупаковать, чтобы структурировать в известный формат (с известным порядком байтов), чтобы можно было надежно прочитать данные обратно.

0 голосов
/ 28 марта 2011

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

0 голосов
/ 28 марта 2011

Вы читаете это обратно так:

ssize_t bytes_read = read(fd, &buf, sizeof buf);
if(-1 == bytes_read)
    ; // handle read error
if(sizeof buf != bytes_read)
    ; // handle incomplete read
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...