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

我习惯用scanf,printf函数先把几个结构体赋值,然后用fprintf函数将其写入文件中,我用到的格式是:%d%s%d\n为一个结构体,进行循环输出到一个文件中,这... 我习惯用scanf,printf函数先把几个结构体赋值,
然后用fprintf函数将其写入文件中,我用到的格式是:
%d %s %d\n为一个结构体,进行循环输出到一个文件中,这种做法是不是不好?
还有,我要读取的时候,%s字符串中有空格,系统把他与要输入的成员间隔空格混在一起了
导致读取结构体完全错位,有更好的办法处理这个问题吗?
展开
 我来答
金色潜鸟
2012-07-20 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5633万
展开全部
最好用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
会飞的呆头
2015-09-27 · 超过17用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:24.6万
展开全部
结构体写入文件是有前提的,你的结构体中不能出现指针,如果确定结构体中没有指针的话,就可以进行如下操作
typedef struct
{
//中间不能定义指针;
}a;
a var //结构体定义的变量

fwrite(&var, sizeof(a), sizeof(a), hfile);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1cf58ab
2012-07-20 · TA获得超过343个赞
知道小有建树答主
回答量:276
采纳率:50%
帮助的人:365万
展开全部
在输出到文件时,为什么要用空格作为区分标志呢?可以用逗号或者其他的符号,只要不与字符串中的字母相同即可,比如:
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里面的空格作为区分标志
追答
读的时候,把文件一次读出到一个长字符串中,再用标志区分各个数据。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
beswor
2012-07-21 · TA获得超过582个赞
知道小有建树答主
回答量:219
采纳率:0%
帮助的人:206万
展开全部
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了.对这一点应用熟练了,你会充分感受到指针带来的便捷,在很多问题上也就如鱼得水……

仅供参考!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式