zoukankan      html  css  js  c++  java
  • 【C++ IO机制】文件输入输出 ①

    文件输入输出

    对于文件读取流和向文件写入流,需要用到 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 的用途与局限

  • 相关阅读:
    滑动窗口法与剑指offer:和为S的连续正数数列 与 和为S的两个数字
    数组中的逆序对与归并中的分治思想
    重读STL源码剖析:迭代器
    重读深度探索C++对象模型:函数
    FreeMarker笔记 前言&第1章 入门
    分享我的PL/SQL的优化设置,为开发全面提速
    迅影QQ视频查看v2.0 源码
    Invalid encoding name "UTF8". 报错 XML
    [HNOI2003]消防局的设立
    We need water!
  • 原文地址:https://www.cnblogs.com/sunbines/p/15730212.html
Copyright © 2011-2022 走看看