(3)用二进制形式读写文件
① 用二进制的方式写文件,binaryWrite.cpp:
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<fstream>//引入fstream头文件 3. using namespace std; 4. 5. int main() 6. { 7. //1.定义文件流对象 8. ofstream writeFile; 9. 10. //2.打开磁盘文件-----创建一个名为IO.txt的文件,并以二进制的方式把数据以"流"的形式从内存输出到文件 11. writeFile.open("binaryWrite.bin", ofstream::out | ofstream::binary); 12. 13. //3.对文件写入 14. writeFile << "C++ ";//将"C++"插入到文件 15. writeFile.put('\n');//将换行符插入到文件 16. 17. char str[] = "hello"; 18. writeFile.write(str, strlen(str));//将str插入到文件 19. 20. //4.关闭文件 21. writeFile.close(); 22. 23. return 0; 24. }
运行之后,在该cpp文件同目录位置会出现binaryWrite.bin文件
用notepad++打开binaryWrite.bin,发现"C++"和"hello"已经被输出到文件 :
② 用二进制的方式读文件,binaryRead.cpp
在同级文件夹内创建 binaryRead.bin文件,并写入以下内容:
binaryRead.cpp:
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<fstream>//引入fstream头文件 3. using namespace std; 4. 5. int main() 6. { 7. //1.定义文件流对象 8. ifstream readFile; 9. 10. //2.打开磁盘文件 11. readFile.open("binaryRead.bin", ifstream::in | ifstream::binary);//创建一个名为binaryRead.bin的文件,并以二进制的方式把数据以"流"的形式从文件输入到内存 12. 13. readFile.seekg(0, readFile.end);//跳到文件结尾 14. int length = readFile.tellg();//获取当前字符在文件当中的位置,即文件的字符总数 15. readFile.seekg(0, readFile.beg);//跳到文件开头 16. 17. //3.将文件内容读入字符串 18. char readStr[300]; 19. readFile.read(readStr, length);//将文件内容输入到字符串中 20. 21. for (int i = 0; i < length; i++) 22. { 23. printf("%c", readStr[i]);//打印字符串 24. } 25. 26. //4.关闭文件 27. readFile.close(); 28. 29. return 0; 30. }
运行之后:
(4)用文本形式读写文件
① 用文本的方式写文件,textReadWrite.cpp
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<string> 3. #include<fstream> 4. #include<istream> 5. #include<iostream> 6. using namespace std; 7. 8. //IP和端口号类 9. struct IPPortInfo 10. { 11. char _ip[20];//IP地址 12. int _port;//端口号 13. }; 14. 15. //进程类 16. struct Process 17. { 18. public: 19. Process(const char* filename) 20. :_filename(filename) 21. {} 22. 23. //将内存内容输出到文件 24. void WriteTxt(const IPPortInfo& info) 25. { 26. //定义文件流对象 27. ofstream ofs(_filename); 28. 29. //写入IP 30. ofs.write(info._ip, strlen(info._ip)); 31. 32. //写入换行符 33. ofs.put('\n'); 34. 35. //写入端口号 36. string sPort = to_string(info._port); 37. ofs.write(sPort.c_str(), sPort.size()); 38. 39. //关闭 40. ofs.close(); 41. } 42. 43. private: 44. string _filename;//文件名 45. }; 46. 47. int main() 48. { 49. IPPortInfo writeInfo = { "10.163.236.196",23 };//定义输出到文件的内容对象 50. Process process("textWrite.txt");//构造进程对象 51. process.WriteTxt(writeInfo);//将对象内容输出到文本 52. 53. return 0; 54. }
运行之后,在该cpp文件同目录位置会出现textWrite.txt文件:
打开textWrite.txt,发现IP和端口号已经写入了:
② 用文本的方式写文件,textReadWrite.cpp中增加读文本函数
在进程类中增加读文件方法:
1. //将文本内容输入到内存 2. void ReadTxt(IPPortInfo& Info) 3. { 4. //定义文件流对象 5. ifstream ifs(_filename); 6. 7. //读入ip和port 8. ifs >> Info._ip >> Info._port; 9. 10. //关闭 11. ifs.close(); 12. }
在同级目录创建textRead.txt:
将ip和端口号写入:
在main函数中增加读文件对象,并打印读到的信息:
1. IPPortInfo readInfo; 2. Process process("textRead.txt");//构造进程对象 3. process.ReadTxt(readInfo);//将文本内容输入到内存 4. 5. cout << readInfo._ip << endl; 6. cout << readInfo._port << endl;
程序执行完毕后,打印了IP和端口号:
(5)stringstream
stringstream是操作字符串的流类。在C语言中,如果想把一个整形变量转换成字符串,有两种方法:
① itoa( )
② sprintf( )
但是这两种方法都需要预先给出保存结果的空间大小,这个不好确定。而且格式不匹配时,程序会崩溃。但是stringstream可以避开这些问题。
istringstream用来进行流输入,ostringstream用来进行流输出,iostringstream用来进行流输入和输出。stringstream的头文件为sstream。
① 把数值类型数据格式化为字符串:
注意:
多次转换时,必须使用str函数将stringstream底层管理string对象设置成"", 否则多次转换时,会将结果全部累积在底层string对象中。
多次转换时,必须使用clear将上次转换状态清空掉。stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit。 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换。但是clear()不会将stringstreams底层字符串清空掉
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<sstream> 3. #include<iostream> 4. #include<string> 5. using namespace std; 6. 7. int main() 8. { 9. int id = 1235; 10. string arr; 11. stringstream ss; 12. 13. ss << id;//把整形变量转换成字符串 14. ss >> arr;//把该字符串存储到string类对象arr中 15. cout << arr << endl; 16. 17. ss.str("");//将stringstream底层管理string对象设置成"", 否则多次转换时,会将结果全部累积在底层string对象中 18. ss.clear();//多次转换时,,必须使用clear将上次转换状态清空掉。stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit。 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换。但是clear()不会将stringstreams底层字符串清空掉 19. 20. double d = 3.14; 21. ss << d;//把浮点型变量转换成字符串 22. ss >> arr;//把该字符串存储到string类对象arr中 23. cout << arr << endl; 24. 25. string sValue; 26. sValue = ss.str(); // str()方法:返回stringsteam中管理的string类型 27. cout << sValue << endl; 28. }
②字符串拼接
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<sstream> 3. #include<iostream> 4. #include<string> 5. using namespace std; 6. 7. int main() 8. { 9. stringstream ss; 10. 11. ss << "C"; 12. ss << "++"; 13. cout << ss.str() << endl;//输出拼接结果 14. 15. ss.str("");// 清空 sstream 16. 17. ss << "cplusplus"; 18. cout << ss.str() << endl;//输出清空后的拼接结果 19. }
注意:
① stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
② 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空。
③ 可以使用s. str("")方法将底层string对象设置为""空字符串。
④ 可以使用s.str()将让stringstream返回其底层的string对象。
⑤ stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。