5 个解决方案
#1
struct stA
{
long a;
long b;
struct stB
{
int Year;
int Month;
int Day;
int Hour;
int Min;
int Sec;
} stb;
};
struct stA st1;
st1.a = 1;
st1.b = 2;
st1.stb.Year = 2011;
st1.stb.Month = 7;
...
#2
楼上的答案lz满意吗?
如果不是lz想要的,那lz的意思是不是读一个文件一下子给一个结构体赋值?
如果是这样,那你个文件的内容的格式必须事先知道,或者是事先用同一个结构体的变量的内容写到文件中,结构体里套不套都没关系。
读写的时候用文件的二进制读写函数,取结构体变量的地址,指定读取结构大写的数据块。
借用ls的定义,给一个C语言读写二进制文件的函数:
FILE *fp = fopen("xxx.dat",r);
fread(fp,&stA,1,sizeof(stA));
/* fwrite(fp,,&stA,1 , sizeof(stA)); 这是写一个结构体到二进制文件的语句 */
fclose(fp);
如果不是lz想要的,那lz的意思是不是读一个文件一下子给一个结构体赋值?
如果是这样,那你个文件的内容的格式必须事先知道,或者是事先用同一个结构体的变量的内容写到文件中,结构体里套不套都没关系。
读写的时候用文件的二进制读写函数,取结构体变量的地址,指定读取结构大写的数据块。
借用ls的定义,给一个C语言读写二进制文件的函数:
FILE *fp = fopen("xxx.dat",r);
fread(fp,&stA,1,sizeof(stA));
/* fwrite(fp,,&stA,1 , sizeof(stA)); 这是写一个结构体到二进制文件的语句 */
fclose(fp);
#3
struct S_Test
{
long a;
};
void CMainFrame::Test()
{
int MsgSize; //Msg结构体的大小为48字节
MsgSize=sizeof(stLayCounterMsg);
stLayCounterMsg Msg;
FILE *f = NULL;
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
if (f == NULL)
{
return;
}
unsigned char a[4] = {0};
fread(a, 1, 4, f);
S_Test s;
int i = sizeof(S_Test);
memcpy(&s, a, i);
long b = htonl(s.a);
unsigned char temp[48]={0};
fread(temp,48,1,f);
memcpy(&Msg,temp,MsgSize);
long yy=Msg.receiver_mid;
Msg.stSysTime.ucDate;
long p=htonl(Msg.stSysTime.ucDate);
fclose(f);
}
谢谢。。1、2楼上。
读取二进制文件还是有点问题,时间的值好像不对。请再看看!!!
{
long a;
};
void CMainFrame::Test()
{
int MsgSize; //Msg结构体的大小为48字节
MsgSize=sizeof(stLayCounterMsg);
stLayCounterMsg Msg;
FILE *f = NULL;
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
if (f == NULL)
{
return;
}
unsigned char a[4] = {0};
fread(a, 1, 4, f);
S_Test s;
int i = sizeof(S_Test);
memcpy(&s, a, i);
long b = htonl(s.a);
unsigned char temp[48]={0};
fread(temp,48,1,f);
memcpy(&Msg,temp,MsgSize);
long yy=Msg.receiver_mid;
Msg.stSysTime.ucDate;
long p=htonl(Msg.stSysTime.ucDate);
fclose(f);
}
谢谢。。1、2楼上。
读取二进制文件还是有点问题,时间的值好像不对。请再看看!!!
#4
你打开文件的方式有些问题,
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
b是二进制 ,a+是读和追加写方式打开(文件不存在则创建新文件),文件打开后文件位置指针指向文件末尾,这时候写数据直接追加到文件末,可是读就读不到数据了。要想从头读数据,使用fseek(f,0L,SEEK_SET)函数移动指针到文件开头。如果不打算写文件,建议改成“rb”方式打开文件吧(这样文件不存在就返回NULL,后面的判断语句帮助你确认是否可以继续读文件)。
搞不清楚结果为啥不对,最好的办法是调试跟踪一下, 首先看看读入到变量的值是否正确 ,还是以后的结构体数据使用出现问题了。可以使用uedit之类的可以编辑二进制文件的编辑器打开文件,跟踪程序读到变量的值(用16进制格式查看)和文件中应读的值是否一致。如果没有读错,程序的结果不对,那要么是文件里的数据本身就是错误的,要么是后面的应用地方有问题了。
(还可以参考fread函数的返回值看是否读的时候有错没有。)
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
b是二进制 ,a+是读和追加写方式打开(文件不存在则创建新文件),文件打开后文件位置指针指向文件末尾,这时候写数据直接追加到文件末,可是读就读不到数据了。要想从头读数据,使用fseek(f,0L,SEEK_SET)函数移动指针到文件开头。如果不打算写文件,建议改成“rb”方式打开文件吧(这样文件不存在就返回NULL,后面的判断语句帮助你确认是否可以继续读文件)。
搞不清楚结果为啥不对,最好的办法是调试跟踪一下, 首先看看读入到变量的值是否正确 ,还是以后的结构体数据使用出现问题了。可以使用uedit之类的可以编辑二进制文件的编辑器打开文件,跟踪程序读到变量的值(用16进制格式查看)和文件中应读的值是否一致。如果没有读错,程序的结果不对,那要么是文件里的数据本身就是错误的,要么是后面的应用地方有问题了。
(还可以参考fread函数的返回值看是否读的时候有错没有。)
#5
结构变量地址对齐方式
#1
struct stA
{
long a;
long b;
struct stB
{
int Year;
int Month;
int Day;
int Hour;
int Min;
int Sec;
} stb;
};
struct stA st1;
st1.a = 1;
st1.b = 2;
st1.stb.Year = 2011;
st1.stb.Month = 7;
...
#2
楼上的答案lz满意吗?
如果不是lz想要的,那lz的意思是不是读一个文件一下子给一个结构体赋值?
如果是这样,那你个文件的内容的格式必须事先知道,或者是事先用同一个结构体的变量的内容写到文件中,结构体里套不套都没关系。
读写的时候用文件的二进制读写函数,取结构体变量的地址,指定读取结构大写的数据块。
借用ls的定义,给一个C语言读写二进制文件的函数:
FILE *fp = fopen("xxx.dat",r);
fread(fp,&stA,1,sizeof(stA));
/* fwrite(fp,,&stA,1 , sizeof(stA)); 这是写一个结构体到二进制文件的语句 */
fclose(fp);
如果不是lz想要的,那lz的意思是不是读一个文件一下子给一个结构体赋值?
如果是这样,那你个文件的内容的格式必须事先知道,或者是事先用同一个结构体的变量的内容写到文件中,结构体里套不套都没关系。
读写的时候用文件的二进制读写函数,取结构体变量的地址,指定读取结构大写的数据块。
借用ls的定义,给一个C语言读写二进制文件的函数:
FILE *fp = fopen("xxx.dat",r);
fread(fp,&stA,1,sizeof(stA));
/* fwrite(fp,,&stA,1 , sizeof(stA)); 这是写一个结构体到二进制文件的语句 */
fclose(fp);
#3
struct S_Test
{
long a;
};
void CMainFrame::Test()
{
int MsgSize; //Msg结构体的大小为48字节
MsgSize=sizeof(stLayCounterMsg);
stLayCounterMsg Msg;
FILE *f = NULL;
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
if (f == NULL)
{
return;
}
unsigned char a[4] = {0};
fread(a, 1, 4, f);
S_Test s;
int i = sizeof(S_Test);
memcpy(&s, a, i);
long b = htonl(s.a);
unsigned char temp[48]={0};
fread(temp,48,1,f);
memcpy(&Msg,temp,MsgSize);
long yy=Msg.receiver_mid;
Msg.stSysTime.ucDate;
long p=htonl(Msg.stSysTime.ucDate);
fclose(f);
}
谢谢。。1、2楼上。
读取二进制文件还是有点问题,时间的值好像不对。请再看看!!!
{
long a;
};
void CMainFrame::Test()
{
int MsgSize; //Msg结构体的大小为48字节
MsgSize=sizeof(stLayCounterMsg);
stLayCounterMsg Msg;
FILE *f = NULL;
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
if (f == NULL)
{
return;
}
unsigned char a[4] = {0};
fread(a, 1, 4, f);
S_Test s;
int i = sizeof(S_Test);
memcpy(&s, a, i);
long b = htonl(s.a);
unsigned char temp[48]={0};
fread(temp,48,1,f);
memcpy(&Msg,temp,MsgSize);
long yy=Msg.receiver_mid;
Msg.stSysTime.ucDate;
long p=htonl(Msg.stSysTime.ucDate);
fclose(f);
}
谢谢。。1、2楼上。
读取二进制文件还是有点问题,时间的值好像不对。请再看看!!!
#4
你打开文件的方式有些问题,
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
b是二进制 ,a+是读和追加写方式打开(文件不存在则创建新文件),文件打开后文件位置指针指向文件末尾,这时候写数据直接追加到文件末,可是读就读不到数据了。要想从头读数据,使用fseek(f,0L,SEEK_SET)函数移动指针到文件开头。如果不打算写文件,建议改成“rb”方式打开文件吧(这样文件不存在就返回NULL,后面的判断语句帮助你确认是否可以继续读文件)。
搞不清楚结果为啥不对,最好的办法是调试跟踪一下, 首先看看读入到变量的值是否正确 ,还是以后的结构体数据使用出现问题了。可以使用uedit之类的可以编辑二进制文件的编辑器打开文件,跟踪程序读到变量的值(用16进制格式查看)和文件中应读的值是否一致。如果没有读错,程序的结果不对,那要么是文件里的数据本身就是错误的,要么是后面的应用地方有问题了。
(还可以参考fread函数的返回值看是否读的时候有错没有。)
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
b是二进制 ,a+是读和追加写方式打开(文件不存在则创建新文件),文件打开后文件位置指针指向文件末尾,这时候写数据直接追加到文件末,可是读就读不到数据了。要想从头读数据,使用fseek(f,0L,SEEK_SET)函数移动指针到文件开头。如果不打算写文件,建议改成“rb”方式打开文件吧(这样文件不存在就返回NULL,后面的判断语句帮助你确认是否可以继续读文件)。
搞不清楚结果为啥不对,最好的办法是调试跟踪一下, 首先看看读入到变量的值是否正确 ,还是以后的结构体数据使用出现问题了。可以使用uedit之类的可以编辑二进制文件的编辑器打开文件,跟踪程序读到变量的值(用16进制格式查看)和文件中应读的值是否一致。如果没有读错,程序的结果不对,那要么是文件里的数据本身就是错误的,要么是后面的应用地方有问题了。
(还可以参考fread函数的返回值看是否读的时候有错没有。)
#5
结构变量地址对齐方式