VS2013 使用MFC获取文本文档中的数据并以json格式存储至文件中

这篇博客介绍了在Visual Studio 2013中,由于安全性的考虑,如何使用fopen_s和fscanf_s替代fopen和fscanf进行文件读取,以及如何处理读取过程中遇到的问题。同时,文章还讲解了如何利用rapidjson库进行JSON格式的数据写入,包括创建JSON对象、写入键值对,并将数据写入文件。在处理过程中,注意了空格和回车对读取的影响,以及宽字符转换的方法。
摘要由CSDN通过智能技术生成

#新手,自用#
1.读取文件中的内容
设置edit控件value类型成员变量,作为读文件数据函数的CString形参,这里定为CString FilePath。
首先判断形参传参是否为空,使用ASSERT函数
ASSERT(FilePath != “”);
ASSERT函数需要加上头文件 assert.h ,括号内为0则退出。

由于VS2013版本问题,打开文件的函数fopen因为安全性不能使用,虽然网上可以找到消除这种警告的方法,但此处不做修改(主要是不管用),改用建议的fopen_s函数,以下为fopen_s函数使用方法:
FILE *fp;
errno_t err = 0;
err = fopen_s(&fp,c_FilePath,"r");

当err赋值为0时,文件正常打开。

由于2013版本安全问题,fscanf函数同样不能使用,改用建议的fscanf_s函数。

fscanf(fp,"%s",str);
fscanf_s(fp,"%s",str,_countof(str));

两者的形参数量不同,fscanf_s函数还需要读取内容的长度,网上找的是使用_countof()函数返回长度,但sizeof()函数在运用中也没有出现问题。
此外,需要连续读取数据的情况下,fscanf_s函数在连续纯整形时能使用,其余情况不知,但在选取读入的情况下连续会报错(下面第三种)

//"1 2 3 4 5 6";
fscanf_s(fp,"%d %d %d %d %d %d",str1,str2,str3,str4,str5,str6);
//连续读取情况不加长度不会报错

//"A Hello 1 3"
fscanf_s(fp,"%c %s %d %d",str1,str2,str3,str4);//

//"color=1 size=3"
fscanf_s(fp,"color=%d size=%d",str1,str2);//出错

顺便,fscanf_s函数以空格或者回车结束,当要读入时需注意空格和回车的位置,即使是挨个读入,也要在 " " 中预留空格和回车。

还是因为版本问题,2013版本很多CString转const char*不能用,这里贴上一种可行方法:

CString str;
str = SCNInfos.SCN_S_DateTime.Format(_T("%c"));
const size_t strsize = (str.GetLength() + 1) * 2; //宽字符的长度
char *edit_rec = new char[strsize];
size_t sz = 0;
wcstombs_s(&sz, edit_rec, strsize, str, _TRUNCATE);
int n = atoi((const char*)edit_rec);

注意多次使用时不要重复定义

2.写入文件
使用json格式需要rapidjson类,加入头文件

#include "rapidjson/rapidjson.h"
#include "rapidjson/document.h"
#include "rapidjson/reader.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"

并把VS中的\include\rapidjson文件夹复制到工程目录下

//"ID":123,"Name":tom,"High":180
rapidjson::StringBuffer strBuf;
rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
writer.StartObject();

writer.Key("ID");
writer.Int(123);
writer.Key("Name");
writer.String("tom");
writer.Key("Hifh");
writer.Int(180);

writer.EndObject();

并列的名字用StartObject和EndObject包含起来,下一级就再使用StartObject和EndObject。
要循环添加数组则使用StartArray和EndArray包括起来(for循环外面)

const char* sendData = strBuf.GetString();
FILE *fp;
errno_t err = 0;
err = fopen_s(&fp, FileName, "w");

fwrite(sendData, sizeof(char), strlen(sendData), fp);
fclose(fp);

其中 FileName为要存入的目标文件名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值