c语言 怎么将结构体写入文件

我习惯用scanf,printf函数先把几个结构体赋值,
然后用fprintf函数将其写入文件中,我用到的格式是:
%d %s %d\n为一个结构体,进行循环输出到一个文件中,这种做法是不是不好?
还有,我要读取的时候,%s字符串中有空格,系统把他与要输入的成员间隔空格混在一起了
导致读取结构体完全错位,有更好的办法处理这个问题吗?

最好用2进制方法打开文件,用fwrite 写文件。读时也用用2进制方法打开文件,用fread读.
这样,写的时候按整个结构写,读也按整个结构读,字符串有空白也没关系。
FILE *fp;

fp=fopen("my.dat","wb");
fwrite(&stu,sizeof(stu),1,fp); // 写1个结构
for (i=0;i<10;i++) fwrite(&student[i],sizeof(student),1,fp); // 写10个结构
fclose(fp);

fp=fopen("my.dat","rb");
fread(&stu,sizeof(stu),1,fp); // 读1个结构
for (i=0;i<10;i++) fread(&student[i],sizeof(student),1,fp); // 读 10个结构
fclose(fp);追问

确实解决了这个问题,那么,为什么用二进制打开文件呢?还有,我的文件是.txt格式的,用fwrite写,那文件就只能通过vc来打开,而不能直接打开看了,这问题大不大?

追答

二进制打开文件, 输入输出 按字节读写,不做数据转换,读写速度快,处理大量数据时(一般实际工作中使用)用二进制 快 许许多多倍。
是 不能直接打开看,或者说可以打开,但肉眼不能识别意思(除字符串)。鱼和熊掌不能兼得。
文件名 也可叫 .txt

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-27
结构体写入文件是有前提的,你的结构体中不能出现指针,如果确定结构体中没有指针的话,就可以进行如下操作
typedef struct
{
//中间不能定义指针;
}a;
a var //结构体定义的变量

fwrite(&var, sizeof(a), sizeof(a), hfile);
第2个回答  2012-07-20
在输出到文件时,为什么要用空格作为区分标志呢?可以用逗号或者其他的符号,只要不与字符串中的字母相同即可,比如:
FILE *stream;
stream = fopen( "fprintf.out", "w" );
fprintf( stream, "%d,%s,%d\n", i,s,j);
读完后关闭文件
fclose( stream );
在读入时就不会错了。追问

那么,读取时用什么函数呢?
我若用fscanf(stream,"%d,%s,%d",&i,s,&j)他仍然会默认把%s里面的空格作为区分标志

追答

读的时候,把文件一次读出到一个长字符串中,再用标志区分各个数据。

追问

嗯,知道了,谢谢

第3个回答  2012-07-21
fwrite(&cus[i],sizeof(struct client),1,fp);这一句的作用:
将数组cus的第i+1个结构体写入文件。因为他传入的是指针&cus[i],即第i+1个元素的首位地址,而且写入的长度是该结构体类型的size。
如果你想要把整个结构体数组都写入文件,则应该为:
fwrite(cus,sizeof(cus),1,fp);
或者
fwrite(&cus[0],sizeof(cus),1,fp);

对于像结构体和数组这样的串行数据,在内存中是连续存储的。所以我们在处理的时候,经常只需要确认它的首地址和长度就OK了.对这一点应用熟练了,你会充分感受到指针带来的便捷,在很多问题上也就如鱼得水……

仅供参考!
相似回答