【C++编程】文件输入输出 ①

文件输入输出

对于文件读取流和向文件写入流,需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:

数据类型描述
ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream 该数据类型表示输入文件流,用于从文件读取信息。
fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

 

1. ifstream 原型

template <class CharT, class Traits = std::char_traits<CharT>>
class basic_ifstream : public std::basic_istream<CharT, Traits>

2. ofstream原型:

template <class CharT, class Traits = std::char_traits<CharT>>
class basic_ofstream : public std::basic_ostream<CharT, Traits>

 3. fstream原型:

template <class CharT, class Traits = std::char_traits<CharT>>
class basic_fstream : public std::basic_iostream<CharT, Traits>

 

【注意】

typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
typedef basic_fstream<char> fstream;

 

iostream 现在是模板化的,同时支持窄字符和宽字符。下图是现在的继承体系,同时画出了 fstreams 和 stringstreams。图中方框的第二行是模板的具现化类型,也就是我们代码里常用的具体类型(通过 typedef 定义)。

 

 

这个继承体系糅合了面向对象与泛型编程,但可惜它两方面都不讨好。

再进一步加深了解,发现还有一个平行的 streambuf 继承体系,fstream 和 stringstream 的不同之处主要就在于它们使用了不同的 streambuf 具体类型。

 

1. 例子

 1 #include <iostream>
 2 #include <fstream>
 3 #include <string>
 4 
 5 int main()
 6 {
 7   std::string filename = "test.txt";
 8 
 9   std::ofstream ostrm(filename.c_str(), std::ios::binary);
10   double d = 3.14;
11   ostrm.write(reinterpret_cast<char *>(&d), sizeof d); 
12   ostrm << 123 << "abc" << '\n';
13   ostrm.close();
14 
15   std::ifstream istrm(filename.c_str(), std::ios::binary);
16   double e;
17   istrm.read(reinterpret_cast<char *>(&e), sizeof e);
18   int n;
19   std::string s;
20   istrm >> n >> s;
21   std::cout << "read back: " << e << " " << n << " " << s << '\n';
22 }

 

2. 例子:

 1 #include <iostream>
 2 #include <fstream>
 3 #include <string>
 4 
 5 int main()
 6 {
 7   std::string filename = "test.bin";
 8   std::fstream s(filename, s.binary | s.trunc | s.in | s.out);
 9   if (!s.is_open())
10     std::cout << "failed to open " << filename << '\n';
11   else
12   {
13     double d = 3.14;
14     s.write(reinterpret_cast<char *>(&d), sizeof d); 
15     s << 123 << "abc";                         
16 
17     s.seekp(0);
18     s.read(reinterpret_cast<char *>(&d), sizeof d); 
19     int n;
20     std::string str;
21     if (s >> n >> str) // text input
22       std::cout << "read back from file: " << d << ' ' << n << ' ' << str << '\n';
23   }
24 }

 

参考资料

1. fstream解析【cppreference.com】

2. ifstream解析【cppreference.com】

3. ofstrem解析【cppreference.com】

4. C++ 工程实践(7):iostream 的用途与局限

posted @ 2021-12-25 12:31  苏格拉底的落泪  阅读(129)  评论(1编辑  收藏  举报