C语言对结构体文件的读取

现在只知道一个文件存取数据的时候是用的这个结构体(他的两成员变量都是指针类型的.
)
typedef struct TEST
{
char* ch;
char* cha;
}TESTFEI;

现在要读取这个文件中的数据,应该怎么办呢?
TESTFEI sDHTInfo;
sDHTInfo.ch = new char;
sDHTInfo.cha = new char;
int iCount = fread(sDHTInfo, sizeof(TESTFEI ), 1, pfDHT);
delete......
这样的话读不出来,我跟了一下,是乱码.

这样的思路是:文件打开后它的数据就存在内存了,给结构体的指针变量分配内存后,这个指针就有了地址,然后用fread读取数据后,放到用new分配的内存里.

FILE* pfDHT = NULL;
// DHT文件信息结构体
TESTFEI sDHTInfo;
pfDHT = fopen("96w164_2d_700.dht", "r");
// 文件打开成功
if (NULL != pfDHT)
{
// 主要是这里应该怎么往下做
// 当然在读数据的时候不一定要用到上面那个结构体,
// 请用代码说吧,用文字说不清楚。
int iCount = fread(&sDHTInfo, sizeof(dhtfds), 1, pfDHT);
}

    C语言中对结构体数据格式文件进行读取时,必须以二进制格式打开文件,然后按结构体类型变量内存块方式进行数据读取,相关读数据命令为fread()。

    函数说明:

           #include <stdio.h>

           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中。

    注意,当结构体中定义的变量有指针类型时,在存储数据时,就不能按结构体进行存储了。

    因为,指针变量中存储的是内存地址,而程序在不同环境运行时,所使用的内存地址是不同的,只存储内存地址,不能把真正的数据保存下来,所以,即使是正确读取到文件内容,也不能得到当时的结构体内存数据。因而,在存储结构体数据时,要根据结构体类型变量特点采用正确的方法进行存储,才能正确的读取。

温馨提示:内容为网友见解,仅供参考
第1个回答  2009-03-05
这个结构体

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;
}

函数返回读取的记录数本回答被提问者采纳
第2个回答  2009-03-05
既然给你的是指针,那么就利用这个指针读取字符啊,比如:
char* temp=ch;
while('\0'!=*temp){
//补充你的操作
}
这样的好处是不会改变结构体内指针的值。
第3个回答  2009-03-05
这个哪是一般的指针呀,字符指针就是字符串呀,按字符串读就可以了

C语言文件读写结构体里面的数据怎样存到磁盘文件上
1、首先打开VC++6.0。2、选择文件,新建。3、选择C++ source file 新建一个空白文档。4、首先声明头文件,#include<stdio.h>。5、主函数,定义变量main( ){ FILE *fp; int i; 需要一个结构体,struct rec{ \/*定义结构体类型*\/ char id[10];。6、主要代码if( (fp=fopen("d:\\\\in...

c语言中怎样读取未知结构体存入的信息
用强制转换类型的方法读取,例如:若该结构体存放的地址为a;由于不知道具体占了多少字节,我们就读自己需要的字节吧,例如读100个字节出来:unsigned char buf[100],i,*p;p=(unsigned char *)a;for(i=0;i<100;i++)buf[i]=p[i];这样100个字节就都复制到buf里了 ...

结构体 文件写和读的操作方法
int i,j;fseek(fp,0L,2);\/\/置文件末尾 len=ftell(fp); \/\/计算文件大小 if(len<=0){ printf("file size error!\\n");return 1;} p=(char*)malloc(len);\/\/开辟内存 if(p==NULL){ printf("malloc error\\n");return 1;} fseek(fp,0L,0);\/\/置文件头 if(fread(p,1,len,fp...

c语言如何从文件读入,并存放在链表中
FILE * fp;\/\/读取文件的文件流 struct filetext * p =head;\/\/定义一个p,用来寻找链表中最后一个节点 if((fp=(fopen(filename,"r+")))==NULL){\/\/如果打开文件失败,返回head,并提示 printf("open file failure");return head; } \/\/然后开始读取文件,放到new的buf中 if(fread(new->bu...

C语言结构体读取txt文件中内容,有逗号
用字符读出,判断是否为‘,’,是的话就转化为结构体中的一个变量值,再读取判断,直到都读出来。写入文件的时候每个数据的字节数都是定好的,直接读取一行,然后用memcpy(char* des,char* str,int n)读取,memcpy(des,str+n,m);从第n个字节读m个字节。两种都可以,第二种读字符串的时候有...

c语言怎么用文件保存和读取 结构体数组\/
NULL )return -1 ;fread( (char*)tr , sizeof(struct test), 3 , fp ); \/\/从文件中读三个结构体的数据,也可以一个一个的读 fclose(fp);\/\/输出读到的数据 { int i;for(i=0;i<3;i++ )printf("%d %s %lf\\n" , tr[i].a , tr[i].s, tr[i].d );} return 0;} ...

c语言如何创建文件并将结构体数据存进去
c语言如何创建文件并将结构体数据存进去?需要使用文件操作函数fwrite和fread。 读物文件并写入结构体,同时保存文件的代码如下:1、写 FILE* fp = fopen("card.dat

C语言中的fread函数读取结构体,求助大神!
fread是读取2进制文件的,不要直接使用它读取文本文件,因为需要转换。最好使用,fscanf。如果需要提高效率,可以使用fread+sscanf或者fread+atoi

c语言读文本,文本是关于学生成绩的结构体,然后读入另一个文件并且按照总...
预处理器根据以字符#开头的命令修改原始的c程序,比如#include<stdio.h>告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,将#define的变量替换等等,结果得到了另一个c程序,通常以.i作为文件扩展名。编译器将文本文件hello.i翻译成hello.s,它包含了一个汇编语言程序。汇编语言程序...

C语言结构体的取结构体里参数的问题。。。
你好,是这样的,假如是->的话,这个元素就是一个指向结构体的指针,既然是指针,所以取原本结构体的数据就要用->这个符号,那假如本来就是结构体这个元素的话,取当中的成员就可以直接用.例如struct p{ char a;int num }ss;struct p *q;q=ss;假如要去a成员就可以用 q->a或者ss.a ...

相似回答