【C++】-- IO流(二)

简介: 【C++】-- IO流

(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类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

相关文章
|
2月前
|
测试技术 C++ iOS开发
c++IO库详细介绍
前言 简单分享一下c++ IO相关的一些知识点,希望对大家有用
49 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
59 0
|
4天前
|
安全 编译器 C语言
【C++高阶(九)】C++类型转换以及IO流
【C++高阶(九)】C++类型转换以及IO流
|
安全 C语言 C++
【C++】—— C++的IO流
【C++】—— C++的IO流
|
8月前
|
编译器 C语言 C++
C++ --- 特殊类 --- 类型转换 ---IO流
C++ --- 特殊类 --- 类型转换 ---IO流
48 0
|
4月前
C++IO流文件读写(文本文件,二进制文件)
C++IO流文件读写(文本文件,二进制文件)
40 0
|
4月前
|
算法 C语言 C++
C++的IO流
C++的IO流
25 0
|
5月前
|
安全 C语言 C++
|
5月前
|
编译器 C++
C++入门(1):命名空间,IO流 输入输出,缺省参数
C++入门(1):命名空间,IO流 输入输出,缺省参数
|
5月前
|
人工智能 物联网 编译器
【C++初阶(一)】学习前言 命名空间与IO流
【C++初阶(一)】学习前言 命名空间与IO流
49 0