HappyLifeLife.com
HappyLifeLife.com
HappyLifeLife.com 登录 HappyLifeLife.com 注册 HappyLifeLife.com
爱新闻 爱生活
爱分享 爱学习
爱读书 爱探索
爱音乐 爱宇宙
爱电影 爱地球
爱阅读 爱世界
爱运动 爱科技
爱学习

<< < - > >>
O
json
www.HappyLiveLife.com 收藏 www.happylivelife.com
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
编辑
error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build using the v120 build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects..."选择菜单中 项目--属性--配置属性--常规--平台工具集,选择已有的重新编译C++ string的用法和例子使用场合:string是C++标准库的一个重要的部分,主要用于字符串处理。可以使用输入输出流方式直接进行操作,也可以通过文件等手段进行操作。同时C++的算法库对string也有着很好的支持,而且string还和c语言的字符串之间有着良好的接口。虽然也有一些弊端,但是瑕不掩瑜。 其中使用的代码多数都是来自cpp官网,因为例子非常全。声明和初始化方法:想使用string首先要在头文件当中加入< string > 声明方式也很简单声明:string s;//声明一个string 对象string ss[10];//声明一个string对象的数组12初始化:使用等号的初始化叫做拷贝初始化,不使用等号的初始化叫做直接初始化。#include using namespace std;int main(){ ios::sync_with_stdio(false); string s;//默认初始化,一个空字符串 string s1("ssss");//s1是字面值“ssss”的副本 string s2(s1);//s2是s1的副本 string s3=s2;//s3是s2的副本 string s4(10,'c');//把s4初始化 string s5="hiya";//拷贝初始化 string s6=string(10,'c');//拷贝初始化,生成一个初始化好的对象,拷贝给s6 //string s(cp,n) char cs[]="12345"; string s7(cs,3);//复制字符串cs的前3个字符到s当中 //string s(s2,pos2) string s8="asac"; string s9(s8,2);//从s2的第二个字符开始拷贝,不能超过s2的size //string s(s2,pos2,len2) string s10="qweqweqweq"; string s11(s10,3,4);//s4是s3从下标3开始4个字符的拷贝,超过s3.size出现未定义 return 0;}字符串处理:substr操作:注意substr没有迭代器作为参数的操作#include using namespace std;int main(){ ios::sync_with_stdio(false); string s="abcdefg"; //s.substr(pos1,n)返回字符串位置为pos1后面的n个字符组成的串 string s2=s.substr(1,5);//bcdef //s.substr(pos)//得到一个pos到结尾的串 string s3=s.substr(4);//efg return 0;}如果输入的位置超过字符的长度,会抛出一个out_of_range的异常insert操作:代码来自cpp官网,经过自己的整理 注意用迭代器当参数和无符号数当参数的区别#include using namespace std;int main(){ ios::sync_with_stdio(false); string str="to be question"; string str2="the "; string str3="or not to be"; string::iterator it; //s.insert(pos,str)//在s的pos位置插入str str.insert(6,str2); // to be the question //s.insert(pos,str,a,n)在s的pos位置插入str中插入位置a到后面的n个字符 str.insert(6,str3,3,4); // to be not the question //s.insert(pos,cstr,n)//在pos位置插入cstr字符串从开始到后面的n个字符 str.insert(10,"that is cool",8); // to be not that is the question //s.insert(pos,cstr)在s的pos位置插入cstr str.insert(10,"to be "); // to be not to be that is the question //s.insert(pos,n,ch)在s.pos位置上面插入n个ch str.insert(15,1,':'); // to be not to be: that is the question //s.insert(s.it,ch)在s的it指向位置前面插入一个字符ch,返回新插入的位置的迭代器 it = str.insert(str.begin()+5,','); // to be, not to be: that is the question //s.insert(s.it,n,ch)//在s的it所指向位置的前面插入n个ch str.insert (str.end(),3,'.'); // to be, not to be: that is the question... //s.insert(it,str.ita,str.itb)在it所指向的位置的前面插入[ita,itb)的字符串 str.insert (it+2,str3.begin(),str3.begin()+3); // to be, or not to be: that is the question... return 0;}erase操作:用来执行删除操作 删除操作有三种指定pos和len,其中pos为为起始位置,pos以及后面len-1个字符串都删除迭代器,删除迭代器指向的字符迭代器范围,删除这一范围的字符串,范围左闭右开代码来自cpp官网#include #include int main (){ std::string str ("This is an example sentence."); std::cout << str << '\n'; // "This is an example sentence." str.erase (10,8); // ^^^^^^^^ //直接指定删除的字符串位置第十个后面的8个字符 std::cout << str << '\n'; // "This is an sentence." str.erase (str.begin()+9);// ^ //删除迭代器指向的字符 std::cout << str << '\n'; // "This is a sentence." // ^^^^^ str.erase (str.begin()+5, str.end()-9); //删除迭代器范围的字符 std::cout << str << '\n'; // "This sentence." return 0;}append和replace操作:append函数可以用来在字符串的末尾追加字符和字符串。由于string重载了运算符,也可以用+=操作实现 repalce顾名思义,就是替换的意思,先删除,后增加。 代码来自cpp官网,附上自己的解释#include #include int main (){ std::string str; std::string str2="Writing "; std::string str3="print 10 and then 5 more"; //直接追加一个str2的字符串 str.append(str2); // "Writing " //后面追加str3第6个字符开始的3个字符串 str.append(str3,6,3); // "10 " //追加字符串形参的前5个字符 str.append("dots are cool",5); // "dots " //直接添加 str.append("here: "); // "here: " //添加10个'.' str.append(10u,'.'); // ".........." //添加str3迭代器范围的字符串 str.append(str3.begin()+8,str3.end()); // " and then 5 more" //最后这个比较特殊,意思是添加5个'A',实际上参数里面的65对应的asc码就是65 str.append(5,65); // "....." //字符串追加也可以用重载运算符实现 str+="lalala"; std::cout << str << '\n'; return 0;}replace的使用方法,replace支持使用无符号整数寻找位置,也支持用迭代器寻找位置#include #include int main (){ std::string base="this is a test string."; std::string str2="n example"; std::string str3="sample phrase"; std::string str4="useful."; // replace signatures used in the same order as described above: // Using positions: 012345678912345678912345 std::string str=base; // "this is a test string." //第9个字符以及后面的4个字符被str2代替 str.replace(9,5,str2); // "this is an example string." (1) //第19个字符串以及后面的5个字符用str的第7个字符以及后面的5个字符代替 str.replace(19,6,str3,7,6); // "this is an example phrase." (2) //第8个字符以及后面的9个字符用字符串参数代替 str.replace(8,10,"just a"); // "this is just a phrase." (3) //第8个字符以及后面的5个字符用字符串参数的前7个字符替换 str.replace(8,6,"a shorty",7); // "this is a short phrase." (4) //第22以及后面的0个字符用3个叹号替换 str.replace(22,1,3,'!'); // "this is a short phrase!!!" (5) //迭代器的原理同上 // Using iterators: 0123456789123456789 str.replace(str.begin(),str.end()-3,str3); // "sample phrase!!!" (1) str.replace(str.begin(),str.begin()+6,"replace"); // "replace phrase!!!" (3) str.replace(str.begin()+8,str.begin()+14,"is coolness",7); // "replace is cool!!!" (4) str.replace(str.begin()+12,str.end()-4,4,'o'); // "replace is cooool!!!" (5) str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// "replace is useful." (6) std::cout << str << '\n'; return 0;}以上的replace操作可以用insert和erase的操作组合替换,但是replace操作更加方便。assign操作: assign操作在一起列容器当中都存在,比如vector等等。是一个很基本的操作函数,string使用assign可以灵活的对其进行赋值。 代码来自cpp官网#include #include int main (){ std::string str; std::string base="The quick brown fox jumps over a lazy dog."; // used in the same order as described above: //直接把base赋值给str str.assign(base); std::cout << str << '\n'; //把base第10个字符以及后面的8个字符赋给str str.assign(base,10,9); std::cout << str << '\n'; // "brown fox" //把参数中的0到6个字符串赋给str str.assign("pangrams are cool",7); std::cout << str << '\n'; // "pangram" //直接使用参数赋值 str.assign("c-string"); std::cout << str << '\n'; // "c-string" //给str赋值10个''字符 str.assign(10,''); std::cout << str << '\n'; // "" //赋值是10个'-' str.assign(10,0x2D); std::cout << str << '\n'; // "----------" //指定base迭代器范围的字符串 str.assign(base.begin()+16,base.end()-12); std::cout << str << '\n'; // "fox jumps over" return 0;}string的搜索操作:string类中提供了很多性能优秀,使用方便的成员方法。而且在泛型算法当中也有很多实用的技巧。find和rfind函数:find函数主要是查找一个字符串是否在调用的字符串中出现过,大小写敏感。 代码来自cpp官网#include using namespace std;int main(){ ios::sync_with_stdio(false); std::string str ("There are two needles in this haystack with needles."); std::string str2 ("needle"); // different member versions of find in the same order as above: //在str当中查找第一个出现的needle,找到则返回出现的位置,否则返回结尾 std::size_t found = str.find(str2); if (found!=std::string::npos) std::cout << "first 'needle' found at: " << found << '\n'; //在str当中,从第found+1的位置开始查找参数字符串的前6个字符 found=str.find("needles are small",found+1,6); if (found!=std::string::npos) std::cout << "second 'needle' found at: " << found << '\n'; //在str当中查找参数中的字符串 found=str.find("haystack"); if (found!=std::string::npos) std::cout << "'haystack' also found at: " << found << '\n'; //查找一个字符 found=str.find('.'); if (found!=std::string::npos) std::cout << "Period found at: " << found << '\n'; //组合使用,把str2用参数表中的字符串代替 // let's replace the first needle: str.replace(str.find(str2),str2.length(),"preposition"); std::cout << str << '\n'; return 0;}rfind函数就是找最后一个出现的匹配字符串,返回的位置仍然是从前往后数的。#include using namespace std;int main(){ ios::sync_with_stdio(false); std::string str ("The sixth sick sheik's sixth sheep's sick."); std::string key ("sixth");// ^ //rfind是找最后一个出现的匹配字符串 std::size_t found = str.rfind(key); if (found!=std::string::npos) { cout<using namespace std;int main(){ ios::sync_with_stdio(false); std::string str1 ("Please, replace the vowels in this sentence by asterisks."); std::size_t found1 = str1.find_first_of("aeiou"); //把所有元音找出来用代替 while (found1!=std::string::npos) { str1[found1]=''; found1=str1.find_first_of("aeiou",found1+1); } std::cout << str1 << '\n'; //在str2中找到第一个不是消协英文字母和空格的字符 std::string str2 ("look for non-alphabetic characters..."); std::size_t found2 = str2.find_first_not_of("abcdefghijklmnopqrstuvwxyz "); if (found2!=std::string::npos) { std::cout << "The first non-alphabetic character is " << str2[found2]; std::cout << " at position " << found2 << '\n'; } return 0;}find_last_of和find_last_not_of与first基本相同,就不写例子代码了。比较与转换:类似c语言的字符串比较函数strcmp函数一样,支持字符串比较操作,同时也类似python、C#语言中的函数一样,支持把数字和字符串转换。有些特性是C++11当中才有。 注意编译器bug: 在MinGW编译器当中如果版本低于3.8,虽然支持c++11但是里面有一个bug,就是不支持字符串和数组的转换!要更新MinGW的版本才可以,或者直接使用g++。compare函数:和strcmp函数一样,如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1。 在compare当中还支持部分比较,里面有6个参数可以设置。#include using namespace std;int main(){ ios::sync_with_stdio(false); string s1="123",s2="123"; cout<,<,==来进行比较,也很方便。数值转换:在io的部分有过数值和字符串相互转换的例子,使用的是stringstream函数,在c++11当中有定义好的现成的函数取调用,非常方便。string和数值转换 to_string(val) 把val转换成stringstoi(s,p,b) 把字符串s从p开始转换成b进制的intstol(s,p,b) longstoul(s,p,b) unsigned longstoll(s,p,b) long longstoull(s,p,b) unsigned long longstof(s,p) floatstod(s,p) doublestold(s,p) long double//注意,下段代码在MinGw中会报错!即使使用c++11编译也一样,无法识别to_string!#include using namespace std;int main(){ ios::sync_with_stdio(false); string s1; s1=to_string(100); cout<(译者注:在标准C++中,已经使用取代< fstream.h>,所有的C++标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。  如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部分,首先声明一个类对象。ofstream fout;  这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。fout.open("output.txt");  你也可以把文件名作为构造参数来打开一个文件.ofstream fout("output.txt");  这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操作很像。 对不了解控制台输出"cout"的人, 这里有个例子。int num = 150;char name[] = "John Doe";fout << "Here is a number: " << num << "\n";fout << "Now here is a string: " << name << "\n";  现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样:fout << flush; fout.close();   现在你用文本编辑器打开文件,内容看起来是这样:  Here is a number: 150 Now here is a string: John Doe  很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<<" 和">>" 比较熟悉了, 因为你接下来还要用到他们。继续…  二、ASCII 输入  输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前, 先看一个文本:  12 GameDev 15.45 L This is really awesome!  为了打开这个文件,你必须创建一个in-stream对象,?像这样。ifstream fin("input.txt");  现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<<" (插入)?操作符之后,是">>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.int number;float real;char letter, word[8];fin >> number; fin >> word; fin >> real; fin >> letter;  也可以把这四行读取文件的代码写为更简单的一行。fin >> number >> word >> real >> letter;  它是如何运作的呢? 文件的每个空白之后, ">>" 操作符会停止读取内容, 直到遇到另一个>>操作符. 因为我们读取的每一行都被换行符分割开(是空白字符), ">>" 操作符只把这一行的内容读入变量。这就是这个代码也能正常工作的原因。但是,可别忘了文件的最后一行。  This is really awesome!  如果你想把整行读入一个char数组, 我们没办法用">>"?操作符,因为每个单词之间的空格(空白字符)会中止文件的读取。为了验证:char sentence[101]; fin >> sentence;  我们想包含整个句子, "This is really awesome!" 但是因为空白, 现在它只包含了"This". 很明显, 肯定有读取整行的方法, 它就是getline()。这就是我们要做的。fin.getline(sentence, 100);  这是函数参数. 第一个参数显然是用来接受的char数组. 第二个参数是在遇到换行符之前,数组允许接受的最大元素数量. 现在我们得到了想要的结果:“This is really awesome!”。  你应该已经知道如何读取和写入ASCII文件了。但我们还不能罢休,因为二进制文件还在等着我们。  三、二进制 输入输出  二进制文件会复杂一点, 但还是很简单的。首先你要注意我们不再使用插入和提取操作符(译者注:<< 和 >> 操作符). 你可以这么做,但它不会用二进制方式读写。你必须使用read() 和write() 方法读取和写入二进制文件. 创建一个二进制文件, 看下一行。ofstream fout("file.dat", ios::binary);  这会以二进制方式打开文件, 而不是默认的ASCII模式。首先从写入文件开始。函数write() 有两个参数。 第一个是指向对象的char类型的指针, 第二个是对象的大小(译者注:字节数)。 为了说明,看例子。int number = 30; fout.write((char )(&number), sizeof(number));  第一个参数写做"(char )(&number)". 这是把一个整型变量转为char 指针。如果你不理解,可以立刻翻阅C++的书籍,如果有必要的话。第二个参数写作"sizeof(number)". sizeof() 返回对象大小的字节数. 就是这样!  二进制文件最好的地方是可以在一行把一个结构写入文件。 如果说,你的结构有12个不同的成员。 用ASCII?文件,你不得不每次一条的写入所有成员。 但二进制文件替你做好了。 看这个。struct OBJECT { int number; char letter; } obj;obj.number = 15;obj.letter = ‘M’;fout.write((char )(&obj), sizeof(obj));  这样就写入了整个结构! 接下来是输入. 输入也很简单,因为read()?函数的参数和 write()是完全一样的, 使用方法也相同。ifstream fin("file.dat", ios::binary); fin.read((char )(&obj), sizeof(obj));  我不多解释用法, 因为它和write()是完全相同的。二进制文件比ASCII文件简单, 但有个缺点是无法用文本编辑器编辑。 接着, 我解释一下ifstream 和ofstream 对象的其他一些方法作为结束.  四、更多方法  我已经解释了ASCII文件和二进制文件, 这里是一些没有提及的底层方法。  检查文件  你已经学会了open() 和close() 方法, 不过这里还有其它你可能用到的方法。  方法good() 返回一个布尔值,表示文件打开是否正确。  类似的,bad() 返回一个布尔值表示文件打开是否错误。 如果出错,就不要继续进一步的操作了。  最后一个检查的方法是fail(), 和bad()有点相似, 但没那么严重。  读文件  方法get() 每次返回一个字符。  方法ignore(int,char) 跳过一定数量的某个字符, 但你必须传给它两个参数。第一个是需要跳过的字符数。 第二个是一个字符, 当遇到的时候就会停止。 例子,fin.ignore(100, ‘\n’);  会跳过100个字符,或者不足100的时候,跳过所有之前的字符,包括 ‘\n’。  方法peek() 返回文件中的下一个字符, 但并不实际读取它。所以如果你用peek() 查看下一个字符, 用get() 在peek()之后读取,会得到同一个字符, 然后移动文件计数器。  方法putback(char) 输入字符, 一次一个, 到流中。我没有见到过它的使用,但这个函数确实存在。  写文件  只有一个你可能会关注的方法.?那就是 put(char), 它每次向输出流中写入一个字符。  打开文件  当我们用这样的语法打开二进制文件:ofstream fout("file.dat", ios::binary);  "ios::binary"是你提供的打开选项的额外标志. 默认的, 文件以ASCII方式打开, 不存在则创建, 存在就覆盖. 这里有些额外的标志用来改变选项。  ios::app 添加到文件尾  ios::ate 把文件标志放在末尾而非起始。  ios::trunc 默认. 截断并覆写文件。  ios::nocreate 文件不存在也不创建。  ios::noreplace 文件存在则失败。  文件状态  我用过的唯一一个状态函数是eof(), 它返回是否标志已经到了文件末尾。 我主要用在循环中。 例如, 这个代码断统计小写‘e’ 在文件中出现的次数。ifstream fin("file.txt");char ch; int counter;while (!fin.eof()) {ch = fin.get();if (ch == ‘e’) counter++;}fin.close();Project预处理 _CRT_SECURE_NO_WARNINGSc/c++-》代码生成-》运行库 .cpp预编译头 不一、在VS2008工程中,经常出现warning LNK4099: 未找到 PDB“vc90.pdb等问题,解决办法如下:1. 在项目属性—C/C++—输出文件—程序数据库文件名后面填写$(IntDir)\vc80.pdb。2. 在项目属性—连接器—调试—生成调试信息后面改成“否”。二、出现:mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file 错误提示的解决办法:1. 把工程debug目录下的文件都删除,重新清理并重新生成解决方案即可;2. 上网找了一下,只有英文网页有相关讨论,懒得去翻译了。中文网页中倒是有一个,而且有解决办法,那就是在项目属性——配置属性——链接器——清单文件中, 把生成清单改成否就行了。经过进一步的探索,发现在项目属性——配置属性——清单工具——输入和输出中,把嵌入清单改成否也行。三、VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题Debug模式,运行时完全正常,但是一调试就出现对话框,显示出错信息: “无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。” VC项目是空项目。发现其他的项目都可以调试,就“空项目”不行。解决方法:首先打开菜单 项目->项目属性页 1。选择 配置属性->链接器->调试->生成调试信息 改为 是 2。选择 配置属性->C/C++ ->常规->调试信息格式 改为 用于“编辑并继续”的程序数据库(/ZI) 3。选择 配置属性->C/C++ ->优化->优化 改为 禁用(/Od) "warning LNK4098: 默认库LIBCMT与其他库的使用冲突;请使用 /NODEFAULTLIB:library":关键词:warning lnk4098 默认 库 libcmt 与其 他 库 使用 冲突 请使用 nodefaultlib library最近在编译库文件后,使用它做app,遇到如下问题: 1>libcmt.lib(invarg.obj) : error lnk2005: __pinvalidarghandler 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: _initp_misc_invarg 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: _call_reportfault 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: _set_invalid_parameter_handler 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: _get_invalid_parameter_handler 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: _invoke_watson 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: "void __cdecl _invoke_watson(unsigned short const ,unsigned short const ,unsigned short const ,unsigned int,unsigned __int64)" (?_invoke_watson@@yaxpebg00i_k@z) 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: _invalid_parameter 已经在 libcmtd.lib(invarg.obj) 中定义1>libcmt.lib(invarg.obj) : error lnk2005: "void __cdecl _invalid_parameter(unsigned short const ,unsigned short const ,unsigned short const ,unsigned int,unsigned __int64)" (?_invalid_parameter@@yaxpebg00i_k@z) 已经在 libcmtd.lib(invarg.obj) 中定义1>link : warning lnk4098: 默认库“libcmt”与其他库的使用冲突;请使用 /nodefaultlib:library1>d:\cps_project\cps\src\fis\sclserver\x64\release\sclserver.exe : fatal error lnk1169: 找到一个或多个多重定义的符号 解决方法: 工程右键 “属性”->“配置属性”-> “c/c++”-> “代码生成” -> “ 运行库” 选项 设置成“多线程 (/mt)”即可1>正在生成代码 1>e:\Source\VC\?\json\jsoncpp-src-0.6.0-rc2\src\lib_json\json_value.cpp : fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_value.asm”: No such file or directory 1>LINK : fatal error LNK1257: 代码生成失败 1>生成日志保存在“file://f:\work\ServiceMonitor\ServiceMonitor\Release\BuildLog.htm” 1>ServiceMonitor - 2 个错误,1 个警告 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== Debue编译是没问题的,Release下就不行,是什么问题?解决办法:修改生成静态库文件的工程的属性:路径为:菜单---项目--属性---配置属性---c/c++---输出文件---汇编程序输出:无列表 整理:warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library2016年10月11日 22:06:25阅读数:79551>LIBCMT.lib(invarg.obj) : error LNK2005: __pInvalidArgHandler 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: _initp_misc_invarg 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: _call_reportfault 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: _set_invalid_parameter_handler 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: _get_invalid_parameter_handler 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: _invoke_watson 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const ,unsigned short const ,unsigned short const ,unsigned int,unsigned __int64)" (?_invoke_watson@@YAXPEBG00I_K@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: _invalid_parameter 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const ,unsigned short const ,unsigned short const ,unsigned int,unsigned __int64)" (?_invalid_parameter@@YAXPEBG00I_K@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library1>D:\CPS_Project\CPS\src\fis\sclServer\x64\Release\sclServer.exe : fatal error LNK1169: 找到一个或多个多重定义的符号解决方法属性=》配置属性=》输入=》忽略特定库LIBCMT解决方法: 工程右键 “属性”->“配置属性”-> “C/C++”-> “代码生成” -> “ 运行库” 选项 设置成“多线程 (/MT)”即可解决方法:编译工具:VS2008项目--〉属性--〉配置属性--〉链接器--〉输入--〉附加依赖项--〉Nafxcwd.lib Libcmtd.lib项目--〉属性--〉配置属性--〉链接器--〉输入--〉忽略特定库--〉Nafxcwd.lib;Libcmtd.lib若有如下警告:LINK : warning LNK4098: 默认库“uafxcwd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library请注意忽略特定库中二个库之间是否少了分号,如:Nafxcwd.lib;Libcmtd.lib,然后重新生成就没有这个警告了。若是Nafxcwd.lib Libcmtd.lib,就会报这个错误。PS:以上错误原因是由于这二个库有各自的new和delete,这是冲突的,需要指定顺序。正确加载库的顺序是Nafxcwd.lib Libcmtd.lib,而默认的是Libcmtd.lib Nafxcwd.lib。所以就会报出上面的那个error。 在VS2008之IVF11下调用其他库的时候有如下警告:关于VS2008中 默认库“LIBCMT”与其他库的使用冲突的解决方法 - LongShaoAn - LongShaoAn 1>Linking...1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library1>Embedding manifest...只要调用strcpy()函数在程序运行时,总是出现错误:error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.【原因】因为这个函数是不安全,可能造成缓冲区溢出!【常用方法】1、新建项目时不要勾选安全开发生命周期检查2、把strcpy换成strcpy_s3、在文件开头加上 #define _CRT_SECURE_NO_WARNINGS这三种方法一般也会出现其他问题。【最好的解决方法】1、每次调用strcpy函数时在文件开头 加上#pragma warning(disable:4996)。此方法比较直接有效。2、在项目属性C/C++预处理器中加上 _CRT_SECURE_NO_WARNINGS。打开项目,右键属性,如图:编辑点开,添加一行_CRT_SECURE_NO_WARNINGS就行。此方法永久解决问题错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?错误分析: 此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束。没有找到预编译指示信息的头文件"stdafx.h"。 (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它) 我的这个问题发生于我通过添加文件的方式,向MFC内添加现有的一大坨.h和.cpp文件。这些.h和.cpp文件是属于标准C++的开源源代码范畴,与MFC无更深层次的关系。解决方式:一.1) 在解决方案资源管理器中,右击相应的.cpp文件,点击“属性”2) 在左侧配置属性中,点开“C/C++”,单击“预编译头”3) 更改右侧第一行的“创建/使用预编译头”,把选项从“使用预编译头(/Yu)”改成“不使用预编译头”4) 注:每一个报错的.cpp都要如此更改哦~辛苦一下呗~二.(不推荐)1)在解决方案右击工程,点击属性2)在配置属性 -> c/c++ -> 预编译头 中 将 “使用预编译头(/YU)” 改为 “不适用预编译头”这种做法会使每次编译过程非常缓慢备注:1) 貌似也可以直接在.cpp头文件上include stdafx.h。但没尝试如此修改,因为不想破坏源代码的标准性^_^2) 感慨一下VC在识别、编译这方面的迟滞-_-,或许是因为太强大了吧,就没考虑周全,竟然还需要手动修改~3) 有点怀念Qt了…… 补充的资料:出处:http://blog.csdn.net/hotandhot/archive/2006/10/23/1346195.aspx 一、概念:1、预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个“预编译头文件”的时候,则自动从这个编译结果提取需要的信息进行编译。2、预编译结果文件(Precompiled header file):就是那个用来保存已经编译了的符号信息的文件(.PCH作为后缀)3、生成预编译结果文件(Create Precompiled header file):我们说源文件A通过文件B“生成预编译结果文件”是指编译A的时候将其中编译B的编译结果保存成预编译结果文件。一般使用向导的话,A文件就是“stdafx.cpp”,B文件是“stdafx.h”。stdafx.cpp中就一行语句:#include “stdafx.h”4、使用预编译头(Using precompiled header):我们说某个源文件(a.cpp)通过“stdafx.h”来使用预编译结果是指编译a.cpp的时候,如果a.cpp第一行include语句是#include “stdafx.h”的话,那么直接取预编译结果文件的结果,不再重新编译”stdafx.h”二、向导是怎么做的?1、设置“stdafx.cpp”的预编译选项是通过“stdafx.h”文件来“生成预编译结果文件”。2、其他源文件的预编译选项设置是通过“stdafx.h”来“使用预编译头”三、使用原则?1、将相对稳定的头文件(比如CRT,STL,第三方固定的库)全部写在stdafx.h中。(是否使用stdafx.h依赖个人喜好,不过使用stdafx.h可以和向导保持一致)2、全部源文件第一行都加#include “stdafx.h”。3、一些不能修改的源文件(如果公共的代码,不具备权限修改的代码),设置他的预编译选项是“不使用预编译头”。注意,一定不能是选择“自动生成预编译头”,因为这样会将stdafx.h的结果冲掉(这个不知道是BUG还是设计的问题了,.^_^。)。四、Q&AQ、为什么不全部使用“自动生成预编译头文件”?A、“自动生成预编译头文件”和什么都不用没有什么两样,编译速度没有质的提高。Q、手工添加一个新的源文件到项目的时候,经常出现类似错误:fatal error C1010: unexpected end of file while looking for precompiled header directiveA、因为向导缺省的设置是“使用预编译头”,但是你新加的文件并没有在第一行包含“stdafx.h”。解决的方法要么修改成“不使用预编译头”,要么添加一行#include “stdafx.h”Q、加stdafx.h和stdafx.cpp总觉得是和编译平台绑定了C++ 解析Json——jsoncppJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录。Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/,我下载的是v0.5.0,压缩包大约104K。方法一:使用Jsoncpp生成的lib文件 解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译,默认生成静态链接库。 在工程中引用,只需要包含include/json下的头文件及生成的.lib文件即可。 如何包含lib文件:在.cpp文件中#pragma comment(lib."json_vc71_libmt.lib"),在工程属性中Linker下Input中Additional Dependencies写入lib文件名字(Release下为json_vc71_libmt.lib,Debug为json_vc71_libmtd.lib)注意:Jsoncpp的lib工程编译选项要和VS工程中的编译选项保持一致。如lib文件工程编译选项为MT(或MTd),VS工程中也要选择MT(或MTd),否则会出现编译错误问题,debug和release下生成的lib文件名字不同,注意不要看错了,当成一个文件来使用(我就犯了这个错误)。方法二:使用Jsoncpp包中的.cpp和.h文件 解压上面下载的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷贝到工程目录下,将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目录里的文件包含到VS工程中,在VS工程的属性C/C++下General中Additional Include Directories包含头文件目录.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json头文件即可,如:#include "json/json.h"。将json_reader.cpp、json_value.cpp和json_writer.cpp三个文件的Precompiled Header属性设置为Not Using Precompiled Headers,否则编译会出现错误。jsoncpp 使用详解jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。下面是从网上找的代码示例:1. 从字符串解析json const char str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}"; Json::Reader reader; Json::Value root; if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素 { std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000" int code = root["code"].asInt(); // 访问节点,code = 100 } 2. 从文件解析jsonint ReadJsonFromFile(const char filename) { Json::Reader reader;// 解析json用Json::Reader Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array std::ifstream is; is.open (filename, std::ios::binary ); if (reader.parse(is, root, FALSE)) { std::string code; if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist. code = root["uploadid"].asString(); code = root.get("uploadid", "null").asString();// 访问节点,Return the member named key if it exist, defaultValue otherwise. int file_size = root["files"].size(); // 得到"files"的数组个数 for(int i = 0; i < file_size; ++i) // 遍历数组 { Json::Value val_image = root["files"][i]["images"]; int image_size = val_image.size(); for(int j = 0; j < image_size; ++j) { std::string type = val_image[j]["type"].asString(); std::string url = val_image[j]["url"].asString(); printf("type : %s, url : %s \n", type.c_str(), url.c_str()); } } } is.close(); return 0; } 3. 向文件中插入jsonvoid WriteJsonData(const char filename){ Json::Reader reader; Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array std::ifstream is; is.open (filename, std::ios::binary ); if (reader.parse(is, root)) { Json::Value arrayObj; // 构建对象 Json::Value new_item, new_item1; new_item["date"] = "2011-11-11"; new_item1["time"] = "11:11:11"; arrayObj.append(new_item); // 插入数组成员 arrayObj.append(new_item1); // 插入数组成员 int file_size = root["files"].size(); for(int i = 0; i < file_size; ++i) root["files"][i]["exifs"] = arrayObj; // 插入原json中 std::string out = root.toStyledString(); // 输出无格式json字符串 Json::FastWriter writer; std::string strWrite = writer.write(root); std::ofstream ofs; ofs.open("test_write.json"); ofs << strWrite; ofs.close(); } is.close(); }1>libcef_dll_wrapper.lib(ImfFrameBuffer.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(obs-browser.obj 中)工程的运行库不匹配导致的。解决办法: 在编译生成libcef_dll_wrapper.lib的工程中修改, 在工程上右键-》属性-》c/c++-》代码生成-》运行库 有四个选项及含义分别如下: 多线程调试Dll (/MDd) 对应的是MD_DynamicDebug 多线程Dll (/MD) 对应的是MD_DynamicRelease 多线程(/MT) 对应的是MD_StaticRelease 多线程(/MTd)对应的是MD_StaticDebugerror LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug 从上面的错误提示可知,我们原来选择的是 多线程(/MTd) ,改为 多线程调试Dll (/MDd) 选项 即可。当然有的人遇到这样的问题,是要将 多线程调试Dll (/MDd) 改为 多线程(/MTd) 解决问题的。 无论是哪种,总之要将运行库选项配成一致即可!这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了。首先说/MT/MT是 "multithread, static version ” 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。/MD是 "multithread- and DLL-specific version” ,意思是多线程DLL版本,定义了它后,编译器把 MSVCRT.lib 安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。即:静态运行时库:LIBCMT.lib动态运行时库:MSVCRT.lib + MSVCR80.DLL所以,当你用CMAKE生成工程文件时,若CMAKE是用/MT生成的(查看工程原始目录的CMakeLists.txt),则它所调用的运行时库为:LIBCMT.lib,若生成的工程的运行时库(Runtime Library)你选择/MD,则此工程在编译后链接的时候,将会调用动态运行时库:MSVCRT.lib + MSVCR80.DLL,明显,两次对同一个某运行时库里的函数调用的库不同,则会出现重定义的错误。若此工程生成的是库文件,则其他工程调用此库时也必须是/MT。在SQLite的官方网站下载Windows平台下的3.7.4版本的SQLite, 下载地址:http://www.sqlite.org/sqlite-dll-win32-x86-3070400.zip 压缩文件中包含了sqlite3.dll和sqlite3.def文件,接着打开V2008自带的命令行工具(工具->vs2008 command prompt里输入下面的命令行,将sqlite3.dll和sqlite3.def文件放在命令行工具打开时提示的路径), 用LIB命令生成用于连接(LINK)使用的lib文件:LIB /DEF:sqlite3.def /machine:IX86这样就生成了:sqlite3.lib 和 sqlite3.exp 两个文件,sqlite3.lib文件是我们连接程序所使用的。在SQLite官方网站下载SQLite3的源程序, 下载地址:http://www.sqlite.org/sqlite-amalgamation-3070400.zip解压出sqlite3.h文件打开VS2008,新建项目→Visual C++→win32控制台应用程序→(项目名字自己取),然后在项目向导里勾选”空项目”,如下图所示:将(1)和(2)中得到的文件放在项目源文件所在的目录(即stdafx.h所在文件夹)中, 此时该目录下应该包含:sqlite3.hsqlite3.dllsqlite3.libsqlite3.def这四个文件.将sqlite3.h添加到工程中,需要使用数据库的地方#include "sqlite3.h"开始编写程序先配置一下项目,选择菜单: “项目” → “(项目名称) 属性…”, 在弹出的对话框中选择”配置属性” →”链接器” →”输入”, 在”附加依赖项”中输入”sqlite3.lib”,并在”模块定义文件”中输入”sqlite3.def”,如果需要的话,还可以在”延迟加载的dll”里输入”sqlite3.dll”,整体如下图所示:然后继续在对话框中选择”配置属性”→”C/C++”→”预编译头”, 在”创建/使用预编译头”中确认一下状态是”不使用预编译头”,以便项目不会引入一些windows环境相关的预处理选项。然后”确定”。接下来,将sqlite3.h引入项目,然后新建源文件db.cpp和main.cpp,在db.cpp里输入代码:#include #include #include “sqlite3.h” int testdb(void){ sqlite3 db=NULL; char zErrMsg = 0; int rc; //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 rc = sqlite3_open(“zsl.db”, &db); if( rc ) { fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db)); sqlite3_close(db); return (1); } else printf(“You have opened a sqlite3 database named zsl.db successfully!\n”); //创建一个表,如果该表存在,则不创建, //并给出提示信息,存储在zErrMsg 中 char sql = ” CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);” ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); //插入数据 sql = “INSERT INTO \”test\” VALUES(NULL , 1 , 1 , ’200605011206′, 18.9 );” ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); int nrow = 0, ncolumn = 0; //查询结果集的行数、列数 char azResult; //二维数组存放结果 //查询数据 sql = “SELECT FROM test “; sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); int i = 0 ; printf( “row:%d column=%d \n” , nrow , ncolumn ); printf( “\nThe result of querying is : \n” ); for( i=0 ; i<( nrow + 1 ) ncolumn ; i++ ) printf( “azResult[%d] = %s\n”, i , azResult[i] ); //删除数据 sql = “DELETE FROM test WHERE AGE = 1 ;” ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); //释放掉azResult 的内存空间 sqlite3_free_table( azResult ); sqlite3_close(db); //关闭数据库 int c=getchar(); return 0;}在main.cpp里输入代码:#include “sqlite3.h” int testdb(void);int main( void ){ testdb();}json简介及JsonCpp用法json简介json中仅支持两种结构:name->value键值对(pair)的集合,一般称为对象(object)。值的有序表,一般称为数组(array)。1. pair先从键值对(pair)开始,一个pair的通常结构是:string:value键值之间的对应关系使用:表示,左边的为name,右边的为value。一般key使用字符串,当然也可以使用数字,但是不推荐。value的取值就比较随便,可以是任何任何json支持的类型(比如object,array,string,number,true/false,null等)。2. objectobject可以认为是多个pair的集合,官网上给出的示意图如下:object结构示意图其语法是以{作为object开始,以}作为object结束,不同的pair之间使用,分割。需要说明的是object中的数据存储是无序的。下面是一个比较典型的object构成{"name" : "tocy","age" : 1000}3. arrayarray是value的有序集合。先看官网上针对array结构的示意图:array结构示意图其语法是以[作为array起始,以]作为array结束,array元素之间使用,分割。实际使用中建议在array中使用统一的类型,否则解析起来会麻烦点。比如下面语法是合法的:[{"name":"tocy"}, {"age":1000}, {"domain":"cn"}]当然下面这种写法也是可以的,[1, "ts", true, {"key":45}]至于其他的string和number支持的格式,建议参考json官方介绍。JsonCpp的使用json的官网上有很多关于json解析的工具,可以从中选择一个你喜欢的。我主要在c++下使用json,我选择了JsonCpp,官网是:https://github.com/open-source-parsers/jsoncpp。下载完源码之后为了使用方便,直接将源码嵌入到工程中,进入源码所在目录,先生成一个完整的头文件和cpp文件,命令如下:python amalgamate.py然后将dist文件夹拷贝到工程目录就可以使用了。(包含json/json.h、json/json-forwards.h、json.cpp)注意:本部分用例代码可能为了简化期间,并未做错误异常判断,仅供参考。示例1 从文件中读取json文件并解析首先我们提供一个json文件,这里命名为"checkjson.json",其中数据如下:{ "name" : "tocy", "age" : 1000}这里面保存的是最简单的object,我们可以使用下面代码将其读入并解析:void demo_simple(){ ifstream ifs; ifs.open("checkjson.json"); assert(ifs.is_open()); Json::Reader reader; Json::Value root; if (!reader.parse(ifs, root, false)) { cerr << "parse failed \n"; return; } string name = root["name"].asString(); // 实际字段保存在这里 int age = root["age"].asInt(); // 这是整型,转化是指定类型}这里是简单的map访问,然后直接读取对应字段即可。示例2 从内存中读取json数据(object)我们在内存中定义一段json数据,然后解析,这次我们在json中添加内嵌array的object。代码如下:void demo_parse_mem_object(){ const char json_data[] = "{\"name\" : \"Tocy\", \"salary\" : 100, \"msg\" : \"work hard\", \ \"files\" : [\"1.ts\", \"2.txt\"]}"; Json::Reader reader; Json::Value root; // reader将Json字符串解析到root,root将包含Json里所有子元素 if (!reader.parse(json_data, json_data + sizeof(json_data), root)) { cerr << "json parse failed\n"; return; } cout << "demo read from memory ---------\n"; string name = root["name"].asString(); int salary = root["salary"].asInt(); string msg = root["msg"].asString(); cout << "name: " << name << " salary: " << salary; cout << " msg: " << msg << endl; cout << "enter files: \n"; Json::Value files = root["files"]; // read array here for (unsigned int i = 0; i < files.size(); ++i) { cout << files[i].asString() << " "; } cout << endl << endl;}示例3 从内存中解析json数据(array)这次我们从提供一个以array封装的json数据,解析逻辑如下:void demo_parse_mem_array(){ const char json_data[] = "[{\"name\" : \"Tocy\", \"salary\" : 100}, {\"name\" : \"Kit\", \"salary\" : 89}, \ \"a json note\"]"; Json::Reader reader; Json::Value root; // reader将Json字符串解析到root,root将包含Json里所有子元素 if (!reader.parse(json_data, json_data + sizeof(json_data), root)) { cerr << "json parse failed\n"; return; } cout << "demo read from memory using array---------\n"; unsigned int count = root.size() - 1; for (unsigned int i = 0; i < count; ++i) { string name = root[i]["name"].asString(); int salary = root[i]["salary"].asInt(); cout << "name: " << name << " salary: " << salary << endl; } cout << "last msg: " << root[count].asString() << endl; cout << endl << endl;}示例4 简单json数据封装前面三个是关于json数据解析的例子,下面是关于json数据封装的例子。首先我们生成示例1的数据,代码如下:void demo_write_simple(){ Json::Value root; Json::FastWriter writer; Json::Value person; person["name"] = "tocy"; person["age"] = 1000; root.append(person); string json_file = writer.write(root); cout << "demo write json ==============\n"; cout << json_file << endl;}示例5 json封装-内嵌array的object首先我们生成示例2的数据,代码如下:void demo_write_object(){ Json::Value root; Json::FastWriter writer; root["name"] = "tocy"; root["salary"] = 100; root["msg"] = "work hard"; Json::Value files; files[0] = "1.ts"; files[1] = "2.txt"; root["files"] = files; string json_file = writer.write(root); cout << "demo write json object ==============\n"; cout << json_file << endl;}示例6 json封装-内嵌object的array首先我们生成示例3的数据,代码如下:void demo_write_array(){ Json::Value root; Json::FastWriter writer; { Json::Value person; person["name"] = "Tocy"; person["salary"] = 100; root[0] = person; } { Json::Value person; person["name"] = "Kit"; person["salary"] = 89; root[1] = person; } root[2] = "a json note"; string json_file = writer.write(root); cout << "demo write json ==============\n"; cout << json_file << endl;}
* 声明:本文由其作者或媒体撰写,观点仅代表其本身,不代表本站立场。
编辑
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
 
<< < - > >>
[GIT][*] [HIS][*] [JS][*] [Android][*] [DB][*] [Web][*] [JAVA][*] [C][*] [0][*] [TL][*] [O][*] [3D][*] [PAS][*] [IOS][*] [算法][*] [地球][*] [学习方法][*] [探索][*] [宇宙][*] [Linux][*] [阅读秘诀][*] [考试技巧][*] [...]
天天快乐生活[HappyLifeLife.com]
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士