0

構造内のデータを永続的なものにする必要があります。つまり、ファイルに保存したいので、その文字を1文字ずつ読み取る必要があります...このために、以下のコードを書きました...以下のコードは機能しません構造をファイルに(1文字ずつ)書き込むには...その文字が1文字ずつ必要でした

struct x *x1=(struct x*)malloc(sizeof(struct x));
x1->y=29;
x1->c='A';
char *x2=(char *)malloc(sizeof(struct x));
char *s=(char *)malloc(sizeof(struct x));
for(i=0;i<sizeof(struct x);i++)
{
    *(x2+i)=*((char *)x1+i);
}
fd=open("rohit",O_RDWR); 
num1=write(fd,x2,sizeof(struct x));
num2=read(fd,s,sizeof(struct x));
for(i=0;i<sizeof(struct x);i++)
     printf(" %d ",*(s+i));

freadとfwriteを使用できます...しかし、その文字を1文字ずつ実行したかったので、読み取りと書き込みを使用しています(これらは直接システムコールの儀式です)...書き込み機能に書き込むことができませんエラーを表示しています。つまり、-1 を返しています...上記のコードに何か問題がありますか...

4

2 に答える 2

0

必要に応じて使用できる2つの関数は次のとおりです。

int store(char * filename, void * ptr, size_t size)
{
  int fd, n;

  fd = open(filename, O_CREAT | O_WRONLY, 0644);
  if (fd < 0)
    return -1;

  n = write(fd, (unsigned char *)ptr, size);
  if (n != size)
    return -1;

  close(fd);
  return 0;
}

int restore(char * filename, void * ptr, size_t size)
{
  int fd, n;

  fd = open(filename, O_RDONLY, 0644);
  if (fd < 0)
    return -1;

  n = read(fd, (unsigned char *)ptr, size);
  if (n != size)
    return -1;

  close(fd);
  return 0;
}
于 2012-10-29T12:52:56.663 に答える
0

これを C++ としてタグ付けしたので、C++ の回答を提供します。

あなたのコードから私が言えることから、あなたはそのstruct x1ようなものを持っています

 struct { 
     int  y;
     char c;
 };

そして、その状態をディスクとの間でシリアライズしたい場合、これを行うには、いくつかのストリーム挿入およびストリーム抽出オプテレータを作成する必要があります。

//insertions
std::ostream& operator<<(std::ostream& os, const x& x1) {
     return os << x1.y << '\t' << x1.c;
}
//extration
std::istream& operator>>(std::istream& is, x& x1) {
     return is >> x1.y >> x1.c;
}

の状態をシリアライズするためにx、次のことができます

x x1 { 29, 'A' };
std::ofstream file("rohit");
file << x1;

そしてデシリアライズする

x x1;
std::ifstream file("rohit");
file >> x1;
于 2012-10-29T10:13:10.620 に答える