结构体与文件 同时使用时 的实现问题!

Cubeta 2017-02-26 11:01:02
第一步,将每个用户的信息 (将一个结构体内容输出到文件) 分别保存,由于精度问题,使用了二进制文本;
第二步,用fread读取某个用户的文件,现在我想把fread读到的指针赋值给一个结构体变量
此时是否可以结构体“->”这些操作 来操作该用户的各种数据。(比如格式化输出到屏幕,修改值);




...全文
123 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2017-02-27
  • 打赏
  • 举报
回复
仅供参考
typedef struct USERINFO
{
	char szName[10];
	int nScore;
	USERINFO()
	{
		memset(szName ,0 ,10);
		nScore = 0;
	}
	USERINFO(const char * name ,int n)
	{
		strncpy_s(szName ,name ,10);
		nScore = n;
	}
} _UserInfo;



int _tmain(int argc, _TCHAR* argv[])
{
	_UserInfo ui1("xiao ming",100);
	_UserInfo ui2("xiao wang",60);
	// 写入文件
	FILE * f = fopen("test" ,"wb");
	if (f)
	{
		fwrite(&ui1 ,sizeof(_UserInfo) ,1 ,f);
		fwrite(&ui2 ,sizeof(_UserInfo) ,1 ,f);
		fclose(f);
	}

	// 读取并显示
	_UserInfo ui3;
	_UserInfo ui4;
	f = fopen("test" ,"rb");
	if (f)
	{
		fread(&ui3 ,sizeof(_UserInfo) ,1 ,f);
		fread(&ui4 ,sizeof(_UserInfo) ,1 ,f);
		// 显示出来看看
		printf("name:%s socre:%d\n" ,ui3.szName ,ui3.nScore);
		printf("name:%s socre:%d\n" ,ui4.szName ,ui4.nScore);
		fclose(f);
	}
	return 0;
}
自信男孩 2017-02-27
  • 打赏
  • 举报
回复
对于结构体引用结构体元素的符号:->或.; 至于使用那种方式,要看该结构体变量是指针变量(使用->)还是普通变量(使用.)。
赵4老师 2017-02-27
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("AD sizeof %d\n", sizeof(AD));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("A1 sizeof %d\n", sizeof(A1));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("A2 sizeof %d\n", sizeof(A2));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("A4 sizeof %d\n", sizeof(A4));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("A8 sizeof %d\n", sizeof(A8));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("A16 sizeof %d\n", sizeof(A16));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//AD sizeof 32
//
//A1.a 0
//A1.b 4
//A1.c 17
//A1 sizeof 25
//
//A2.a 0
//A2.b 4
//A2.c 18
//A2 sizeof 26
//
//A4.a 0
//A4.b 4
//A4.c 20
//A4 sizeof 28
//
//A8.a 0
//A8.b 4
//A8.c 24
//A8 sizeof 32
//
//A16.a 0
//A16.b 4
//A16.c 24
//A16 sizeof 32
//
//
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
flying_music 2017-02-26
  • 打赏
  • 举报
回复
没太理解你的意思,什么叫读到的指针啊,你保存的不是数据吗?还是保存了一个指针的值?正常的应该是数据,读出来以后可以将这些内容赋值给一个结构体变量的,然后就可以用这个结构体来处理数据了,如果是结构体名,要用“.”操作,如果是一个结构体指针,就用“->”操作,注意这里修改的只是结构体里的东西,要想更新文件,必须重新写回文件

69,371

社区成员

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

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