使用read()系统调用读取结构内容

时间:2011-03-28 10:41:03

标签: c linux struct

#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 个答案:

答案 0 :(得分:2)

lseek(fd,0,SEEK_SET);
read(fd,&buf,sizeof(struct buffer);

会起作用,但还有其他一些事情需要你担心。

  • 这不便携。
  • 您将不得不担心不同版本的结构打包。
  • 您将遇到跨平台的字节序问题。
  • Windows,您可能需要O_BINARY。

重新打包以结构化为已知格式(具有已知的字节顺序)几乎总是更好,这样您就可以可靠地读回数据。

答案 1 :(得分:0)

你这样读回来了:

ssize_t bytes_read = read(fd, &buf, sizeof buf);
if(-1 == bytes_read)
    ; // handle read error
if(sizeof buf != bytes_read)
    ; // handle incomplete read

答案 2 :(得分:0)

向/从文件写入/读取二进制结构是不可移植的(取决于平台体系结构,结构填充等)。为了使您的程序健壮,您可以使用类似XDR的内容。