C语言中对结构体数据格式文件进行读取时,必须以二进制格式打开文件,然后按结构体类型变量内存块方式进行数据读取,相关读数据命令为fread()。
函数说明:
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从stream文件流中,读取nmemb个size大小的数据块到ptr所指的内存buf中,返回读取到的有效数据块数。
如,有如下结构体定义:
typedef struct TEST
{
int num;
double score;
}STRTEST;
STRTEST data ;
FILE *fp = fopen("file.dat", "rb" ) ; //按二进制格式打开文件
int n=fread( &data, sizeof(STRTEST), 1, fp ); //读取一个数据块到变量data中。
注意,当结构体中定义的变量有指针类型时,在存储数据时,就不能按结构体进行存储了。
因为,指针变量中存储的是内存地址,而程序在不同环境运行时,所使用的内存地址是不同的,只存储内存地址,不能把真正的数据保存下来,所以,即使是正确读取到文件内容,也不能得到当时的结构体内存数据。因而,在存储结构体数据时,要根据结构体类型变量特点采用正确的方法进行存储,才能正确的读取。
这个结构体
typedef struct TEST
{
char* ch;
char* cha;
}TESTFEI;
按读取文件要求来说,本身就有问题
char* ch;
char* cha;
ch,cha 是 char 指针 ,应该是char数组
还是在读取文件之前分配了空间???
写个例子
typedef struct TEST
{
char ch[20];
char cha[10];
}TESTFEI;
long ReadBData(TESTFEI* Record, const char* szFileName)
{
FILE *stream;
long total;
if (NULL == (stream = fopen(szFileName, "rb+")))
{
return 0L;
}
total = filelength(fileno(stream)) / sizeof(TESTFEI);
fseek(stream, 0L, SEEK_SET);//移动文件指针到开始
fread(Record, sizeof(TESTFEI), total, stream);
fclose(stream);
return total;
}
函数返回读取的记录数
既然给你的是指针,那么就利用这个指针读取字符啊,比如:
char* temp=ch;
while('\0'!=*temp){
//补充你的操作
}
这样的好处是不会改变结构体内指针的值。
这个哪是一般的指针呀,字符指针就是字符串呀,按字符串读就可以了