当前位置: 技术问答>linux和unix
一个函数构思问题,大家指教。谢谢,初学。
来源: 互联网 发布时间:2016-05-03
本文导语: 想写个函数int wstr2file(char *name,void *p) 返回值可以变成别的类型的,要求实现通过name传进名字,p传进一个结构体指针,把p指向的结构体用sprintf之类的东西转换成一个带有对结构体内变量说明的格式后,写进name命...
想写个函数int wstr2file(char *name,void *p)
返回值可以变成别的类型的,要求实现通过name传进名字,p传进一个结构体指针,把p指向的结构体用sprintf之类的东西转换成一个带有对结构体内变量说明的格式后,写进name命名的文件。
我写了一个:
typedef struct
{
int a;
int b;
char c;
}st;
typedef struct
{
st m;
st n;
int x;
int y;
int z;
}stru;
int wstr2file(char *name,void *p)
{
int fd;
char buf[30];
fd = open(“/tmp/temp”,O_WRONLY|O_CREAT|O_APPEND );
if(fd == -1) printf("open file errorn");
sprintf(buf,"p->m.a is %d",p->m.a);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
.
.
.
.
.
sprintf(buf,"p->m.a is %d",p->n.c);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->x);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->y);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->z);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
return 1;
}
int main()
{
stru *sp;
sp = (stru *)calloc(sizeof(sp),1);
while(1)
wstr2file("filelog",sp);
}
但是感觉我这个函数太笨,是否可以给出一个面向通用结构体的,并且不用从第一个变量到最后一个变量sprintf的。
小弟初学,大家指教。谢谢了
返回值可以变成别的类型的,要求实现通过name传进名字,p传进一个结构体指针,把p指向的结构体用sprintf之类的东西转换成一个带有对结构体内变量说明的格式后,写进name命名的文件。
我写了一个:
typedef struct
{
int a;
int b;
char c;
}st;
typedef struct
{
st m;
st n;
int x;
int y;
int z;
}stru;
int wstr2file(char *name,void *p)
{
int fd;
char buf[30];
fd = open(“/tmp/temp”,O_WRONLY|O_CREAT|O_APPEND );
if(fd == -1) printf("open file errorn");
sprintf(buf,"p->m.a is %d",p->m.a);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
.
.
.
.
.
sprintf(buf,"p->m.a is %d",p->n.c);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->x);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->y);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->z);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
return 1;
}
int main()
{
stru *sp;
sp = (stru *)calloc(sizeof(sp),1);
while(1)
wstr2file("filelog",sp);
}
但是感觉我这个函数太笨,是否可以给出一个面向通用结构体的,并且不用从第一个变量到最后一个变量sprintf的。
小弟初学,大家指教。谢谢了
|
int wstr2file(char *name,void *p)
{
int fd;
char buf[30];
fd = open(name,O_WRONLY|O_CREAT|O_APPEND ); //不是传了文件名吗,把name参数用上撒
if(fd == -1) printf("open file errorn");
sprintf(buf,"p->m.a is %d",p->m.a);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
.
.
.
.
.
sprintf(buf,"p->m.a is %d",p->n.c);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->x);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->y);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->z);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf)); 由于你要对每个结构体成员分别进行说明,我想,只能一个个处理了。
return 1;
}
{
int fd;
char buf[30];
fd = open(name,O_WRONLY|O_CREAT|O_APPEND ); //不是传了文件名吗,把name参数用上撒
if(fd == -1) printf("open file errorn");
sprintf(buf,"p->m.a is %d",p->m.a);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
.
.
.
.
.
sprintf(buf,"p->m.a is %d",p->n.c);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->x);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->y);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf));
sprintf(buf,"p->m.a is %d",p->z);
write(fd,buf,sizeof(buf));
memset(buf,0,sizeof(buf)); 由于你要对每个结构体成员分别进行说明,我想,只能一个个处理了。
return 1;
}
|
up
|
如楼上所说,应该是不行的。
这个问题倒有点类似
http://topic.csdn.net/u/20081210/01/eb52a78a-0308-49cc-9bb1-0573d0fd8a51.html
问题的焦点是:
1)如果既想要遍历结构里的成员变量,又不要把结构里的成员变量显示的表示,如何做得到?
2)如果结构的变量的类型都是一样的,如int,那至少可以通过结构的偏移量获得变量的值,
但是类似sprintf(buf,"p->m.a is %d",p->m.a); 中的格式化字符串"p->m.a“, 如何能得到呢?
这个问题倒有点类似
http://topic.csdn.net/u/20081210/01/eb52a78a-0308-49cc-9bb1-0573d0fd8a51.html
问题的焦点是:
1)如果既想要遍历结构里的成员变量,又不要把结构里的成员变量显示的表示,如何做得到?
2)如果结构的变量的类型都是一样的,如int,那至少可以通过结构的偏移量获得变量的值,
但是类似sprintf(buf,"p->m.a is %d",p->m.a); 中的格式化字符串"p->m.a“, 如何能得到呢?