【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】