sizeof求实际结构体空间大小

lg1198 2012-11-10 10:58:06
结构体:
typedef struct user{
char no[6];
char name[20];
char sex;
}
这样一个结构体

fp_write = fopen("user.txt","r+");

在存入文件的时候,我用:
fwrite(&stu, sizeof(struct user), 1, fp_write);

sizeof计算的是结构体分配的固定大小,但是我在输入name的时候不是固定的大小,比20要小
打开存入的文件时,发现name那段数据前面是输入的数据,后面是乱七八糟的东西,怎么样才能开辟实际大小的空间呢?

主要是为了方便再次从文件读取该数据……
...全文
315 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
baichi4141 2012-11-10
  • 打赏
  • 举报
回复
方便读写文件? 楼主你现在的做法就是最方便的,无视那些垃圾数据就可以了 如果你非要把所有垃圾数据都去掉,那你的程序会比现在麻烦几倍
tonywearme 2012-11-10
  • 打赏
  • 举报
回复
如果是字符串,可以根据结尾的NUL字符(即'\0')来判断有效字符的多少,后面不用管。 如果是其他类型数组,可以加一个变量表示数组中有效数据的长度,如下:
typedef struct user{
   char no[6];
   unsigned int count; //array的实际长度
   int array[20];
   char sex;
}
图灵狗 2012-11-10
  • 打赏
  • 举报
回复
name那段数据前面是输入的数据,后面是乱七八糟的东西,这个没有什么关系的,因为是没有意义的数据,完全不影响你的存取。
newtee 2012-11-10
  • 打赏
  • 举报
回复
跟这个貌似没多少关系 找个例题给你http://blog.csdn.net/lunbobi/article/details/2140736
ouc-ds 2012-11-10
  • 打赏
  • 举报
回复
不会,我还需要学习
JiMoKuangXiangQu 2012-11-10
  • 打赏
  • 举报
回复
对文件的二进制/文本读写方式,分别将宏BIN_OP设为1或0.参考一下.
#include <stdio.h>
#include <stdlib.h>


typedef struct user {
   char no[6];
   char name[20];
   char sex;
} user_t;


#define MAX_LINE 1024
#define BIN_OP	 0


int main(void)
{
	FILE *fp = NULL;
	user_t usr;
	char garbage[MAX_LINE];

#if BIN_OP
	if ((fp = fopen("user.txt", "ab+")) == NULL)
#else
	if ((fp = fopen("user.txt", "a+")) == NULL)
#endif
	{
		fprintf(stderr, "Open file failure!\n");
		exit(EXIT_FAILURE);
	}
	scanf("%s %s %c", usr.no, usr.name, &usr.sex);
	gets(garbage);
#if BIN_OP
	fwrite((const void *)&usr, sizeof(usr), 1, fp);
#else
	fprintf(fp, "%s %s %c\n", usr.no, usr.name, usr.sex);
#endif
	fclose(fp);

#if BIN_OP
	if ((fp = fopen("user.txt", "rb")) == NULL)
#else
	if ((fp = fopen("user.txt", "r")) == NULL)
#endif
	{
		fprintf(stderr, "Open file failure!\n");
		exit(EXIT_FAILURE);
	}
#if BIN_OP
	fread((void *)&usr, sizeof(usr), 1, fp);
#else
	fscanf(fp, "%s %s %c", usr.no, usr.name, &usr.sex);
#endif
	printf("NO: %s\nNAME: %s\nSEX: %c\n", usr.no, usr.name, usr.sex);
	fclose(fp);

	getchar();
	return 0;
}
newtee 2012-11-10
  • 打赏
  • 举报
回复
scanf全用错了
newtee 2012-11-10
  • 打赏
  • 举报
回复
scanf("%s", stu.userno); printf("请输入密码:\n"); scanf("%s", stu.userpass); printf("请输入姓名:\n"); scanf("%s", stu.username); printf("%s", stu.username);
newtee 2012-11-10
  • 打赏
  • 举报
回复
printf("请输入性别:\n"); scanf("%c", &stu.usersex);
lg1198 2012-11-10
  • 打赏
  • 举报
回复
引用 2 楼 zhuankeshumo 的回复:
跟这个貌似没多少关系 找个例题给你http://blog.csdn.net/lunbobi/article/details/2140736
同楼上,求指教
lg1198 2012-11-10
  • 打赏
  • 举报
回复
引用 6 楼 wwwming0329 的回复:
用之前先将结构体清零
同楼上,求指教
lg1198 2012-11-10
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
name那段数据前面是输入的数据,后面是乱七八糟的东西,这个没有什么关系的,因为是没有意义的数据,完全不影响你的存取。
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct user{ char userno[6]; char userpass[6]; char username[20]; char usersex; //f表示女,m表示男 }user; void useradd(){ struct user stu; FILE *fp_open = NULL; if((fp_open = fopen("stu.txt", "r+")) == NULL){ printf("open file error!"); exit(1); } printf("请输入学号:\n"); scanf("%s", &stu.userno); printf("请输入密码:\n"); scanf("%s", &stu.userpass); printf("请输入姓名:\n"); scanf("%s", &stu.username); printf("%s", stu.username); printf("请输入性别:\n"); scanf("%s", &stu.usersex); if(fwrite(&stu, sizeof(struct user stu), 1, fp_open) != 1) printf("write into file error!"); fclose(fp_open); } void show(){ struct user stu; FILE *fp_read = NULL; if((fp_read = fopen("stu.txt", "r+")) == NULL){ printf("open file error!"); exit(1); } fread(&stu, 1, sizeof(struct user), fp_read); fclose(fp_read); printf("%s\n, %s\n, %s\n, %s\n", stu.userno, stu.username, stu.userpass, stu.usersex); } int main(){ useradd(); show(); return 0; } 上代码,求指教
星空之下 2012-11-10
  • 打赏
  • 举报
回复
用之前先将结构体清零

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧