C 读取配置文件/将结构体写入二进制文件/从二进制文件中读出结构体数据

// ConsoleApplicationCReaDFile.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//#include "cstdio"
#include "cstring";
//-- Error	3	error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details
#pragma warning(disable:4996);

//-- 一行一行读取配置文件
void readFile(){
	FILE *fp = nullptr;
	if (0)
	{
		//"r" 文件不存在不会创建文件
		FILE * fp = fopen("config.txt", "r");
	}
	else{
		
		fopen_s(&fp, "config.txt", "r");
	}

	if (!fp)
	{
		printf("文件打开失败!");
	}
	else {
		printf("文件打开成功!");
		//-- 足够一行的长度
		char LineBuf[1248];
		//-- 当前指针是否在文件末尾
		while (!feof(fp))
		{
			//-- 读文件中的一行
			if (fgets(LineBuf, sizeof(LineBuf), fp) == NULL)
			{
				continue;
			}
			//-- 防止出现在行内的'\0', 
			if (LineBuf[0] == '\0')
			{
				continue;
			}

		lblprocsttring:
			if (strlen(LineBuf) > 0)
			{
				//-- 如果行尾是换行,或者回车都截取掉
				if (LineBuf[strlen(LineBuf) - 1] == 10 || LineBuf[strlen(LineBuf) - 1] == 13)
				{
					//-- 把这个设置成字符串的结束标记
					LineBuf[strlen(LineBuf) - 1] = 0;
					goto lblprocsttring;
				}
			}
			//-- 如果出现一个空行
			if (strlen(LineBuf) <= 0)
			{
				continue;
			}
			printf("%s\n",LineBuf);
		}
	}
	fclose(fp);
	/*
	在config.txt文件内写入以下,会打印出
	http://play.goole.com
	http://play.gooletest.com|1d5ds45f56c156as4d56c41ds5|9.14M

	*/
}
//#pragma pack(1) //按照1字节对齐
struct stu
{
	char name[30];
	int age;
	double score;
};
//#pragma pack() //恢复默认的字节对齐方式
//-- 将结构体写入二进制文件
void writeStructToBitFile(){
	//-- 构建二个结构体,并写入数据
	stu s[2];
	s[0].age = 11;
	s[0].score = 68.3;
	strcpy(s[0].name, "哈zhangsan");
	s[1].age = 11;
	s[1].score = 68.3;
	strcpy(s[1].name, "和lisan");
	//-- 文件不存在会创建文件
	FILE * fp = fopen("strcutfile.bin", "wb");
	if (fp == NULL){
		printf("文件打开失败!");
	}
	else
	{
		//-- 文件打开成功,向文件内写入数据
		int structLen = fwrite(&s, sizeof(stu), 2, fp);
		//-- 参数1: 要写入文件中的数据 的地址
		//-- 参数2:要写入文件的字节数
		//-- count: 要写入多少个size字节的数据项
		//-- fp:文件指针,由fopen返回
		//-- 返回值,写入失败返回0,否则就返回第三个参数
		printf("写入%d个size(s)=%d字节的字节数", structLen, sizeof(stu));
		//在window下vs编译器 编译输出:  写入2个size(s)=48字节的字节数

		/*
		1.保存到文件中的结构体,结构体成员不要出现指针类型成员(地址就每次运行会变,取出保存的地址 再用无效error)
		2.结构体成员字节对齐: vs编译器编译会调整成8的整数倍 gcc编译器调整成4的整数倍。  如果要跨系统读取保存的文件,应该使用;#pragma pack(1)设置结构体的对齐方式
		*/
		fclose(fp);
	}
	//printf("写入%d在块变量外", structLen);
}
//-- 从二进制文件中读出结构体数据
void readStructDataFromBitFile(){
	stu s[2];
	FILE * fp = fopen("strcutfile.bin", "rb");
	if (fp != NULL)
	{
		fread(s, sizeof(stu), 2, fp);
		fclose(fp);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	//readFile();
	//writeStructToBitFile();
	readStructDataFromBitFile();
	return 0;
}




  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值