#新手,自用#
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为要存入的目标文件名。