目录

  • `iostream` 库
    • 组成
      • 基本类模板
      • 类模板实例
      • 标准对象
      • 类型
      • 操纵符
    • 源码
  • `ostream` 库
  • `istream` 库
  • `fstream` 库
  • `ios` 库

我们在写C++代码的时候,总会用到 iostream 库,这是C++的标准库,几乎每个程序都会用到它(有一些人则会用 cstdio )。我们细扒出来 iostream 库的源码,却发现 iostream 库里面几乎都是 include 、预处理、 externnamespace 这些东西,其中还有引入 iosostreamistreamstreambuf 等头文件。这又是什么呢?本文就为大家揭秘一下。首先先说最常用的 iostream 库。

iostream

iostream 是指 iostream 库。iostream 的意思是输入输出流,直接点说就是 in(输入) out(输出) stream(流),取in、out的首字母与stream合成。

组成

iostream 库的基础是两种命名为 istreamostream 的类型,分别表示输入流和输出流。流是指要从某种 IO 设备上读出或写入的字符序列。术语“流”试图说明字符是随着时间顺序生成或消耗的。

标准库定义了 4 个 IO 对象。处理输入时使用命名为 cin(读作 see-in )的 istream 类型对象。这个对象也称为标准输入。处理输出时使用命名为 cout(读作 see-out )的 ostream 类型对象,这个对象也称为标准输出。标准库还定义了另外两个 ostream 对象,分别命名为 cerrclog(分别读作 see-errsee-log )。cerr 对象又叫作标准错误,通常用来输出警告和错误信息给程序的使用者。而 clog 对象用于产生程序执行的一般信息。

基本类模板

iostream.h )库的基础是类模板的层级结构。类模板以一种与类型无关的方式,提供了这个库的大部分功能。

基本类模板是一个类模板的集合,其中每个类模板有两个参数:字符类型(charT)参数决定处理的元素类型,而特性参数 对每个特定的元素类型提供一些额外的特征。

这个类层级结构中的类模板和它们的字符类型的实例相比,名字前面多了前缀 basic_ 。例如,istream 由之实例化而来的类模板名为 basic_istreamfstream 由之实例化而来的类模板名为 basic_fstream ,等等。唯一的例外是 ios_base ,因为它本身就是类型无关的,所以它并不基于任何类模板,而是一个正规类。

类模板实例

iostream.h )库中集成了两组标准的整个 iostream 类模板层级结构的实例:一组是面向单字节的,处理 char 类型的元素;另一组是面向宽字节的,处理 wchar_t 类型的元素。
面向单字节( char 型)的实例可能是 iostream.h )库更为人所知的一部分。iosistreamofstream 等类都是面向单字节的。上图是面向单字节的所有类的名称和关系。面向宽字节( wchar_t 型)的实例的命名规则与面向单字节的实例相同,但所有类和对象名称前有前缀 w ,例如 wioswistreamwofstream

标准对象

作为 iostream.h )库的一部分,头文件声明了一些用来在标准输入输出设备上进行输入输出操作的对象。
这些对象分为两组:面向单字节的,即常见的 cincoutcerrclog ;其面向宽字节的对应物,声明为 wcinwcoutwcerrwclog

类型

iostream.h )库中的类很少对其成员的原型使用基本类型,而是通常使用根据其实例的特性定义的类型。对默认的 charwchar_t 型的实例,类型 streamposstreamoffstreamsize分别用以表示位置、偏移和大小。

操纵符

操纵符是用来与对流对象进行操作的插入( << )和提取( >> )运算符一同使用的全局函数。它们通常变更流的属性和格式设置。endlhexscientific 是一些操纵符的例子。

源码

这是 iostream 库的源码:


// -*- C++ -*-
//===--------------------------- iostream ---------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//#ifndef _LIBCPP_IOSTREAM
#define _LIBCPP_IOSTREAM#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>namespace std {extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;
extern wistream wcin;
extern wostream wcout;
extern wostream wcerr;
extern wostream wclog;}  // std#include <__config>
#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif_LIBCPP_BEGIN_NAMESPACE_STD#ifndef _LIBCPP_HAS_NO_STDIN
extern _LIBCPP_FUNC_VIS istream cin;
extern _LIBCPP_FUNC_VIS wistream wcin;
#endif
#ifndef _LIBCPP_HAS_NO_STDOUT
extern _LIBCPP_FUNC_VIS ostream cout;
extern _LIBCPP_FUNC_VIS wostream wcout;
#endif
extern _LIBCPP_FUNC_VIS ostream cerr;
extern _LIBCPP_FUNC_VIS wostream wcerr;
extern _LIBCPP_FUNC_VIS ostream clog;
extern _LIBCPP_FUNC_VIS wostream wclog;_LIBCPP_END_NAMESPACE_STD#endif  // _LIBCPP_IOSTREAM

ostream

说完了 iostream 库,我们再来看看 ostream 库。上面已经提到过,ostream 是专为窄字节设计的输出库。这是 ostream 库的源码,比较长:

// Output streams -*- C++ -*-// Copyright (C) 1997-2019 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>./** @file include/ostream*  This is a Standard C++ Library header.*///
// ISO C++ 14882: 27.6.2  Output streams
//#ifndef _GLIBCXX_OSTREAM
#define _GLIBCXX_OSTREAM 1#pragma GCC system_header#include <ios>
#include <bits/ostream_insert.h>namespace std _GLIBCXX_VISIBILITY(default)
{_GLIBCXX_BEGIN_NAMESPACE_VERSION/***  @brief  Template class basic_ostream.*  @ingroup io**  @tparam _CharT  Type of character stream.*  @tparam _Traits  Traits for character type, defaults to*                   char_traits<_CharT>.**  This is the base class for all output streams.  It provides text*  formatting of all builtin types, and communicates with any class*  derived from basic_streambuf to do the actual output.*/template<typename _CharT, typename _Traits>class basic_ostream : virtual public basic_ios<_CharT, _Traits>{public:// Types (inherited from basic_ios):typedef _CharT                 char_type;typedef typename _Traits::int_type        int_type;typedef typename _Traits::pos_type         pos_type;typedef typename _Traits::off_type         off_type;typedef _Traits                    traits_type;// Non-standard Types:typedef basic_streambuf<_CharT, _Traits>        __streambuf_type;typedef basic_ios<_CharT, _Traits>       __ios_type;typedef basic_ostream<_CharT, _Traits>     __ostream_type;typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >__num_put_type;typedef ctype<_CharT>                 __ctype_type;/***  @brief  Base constructor.**  This ctor is almost never called by the user directly, rather from*  derived classes' initialization lists, which pass a pointer to*  their own stream buffer.*/explicitbasic_ostream(__streambuf_type* __sb){ this->init(__sb); }/***  @brief  Base destructor.**  This does very little apart from providing a virtual base dtor.*/virtual~basic_ostream() { }/// Safe prefix/suffix operations.class sentry;friend class sentry;//@{/***  @brief  Interface for manipulators.**  Manipulators such as @c std::endl and @c std::hex use these*  functions in constructs like "std::cout << std::endl".  For more*  information, see the iomanip header.*/__ostream_type&operator<<(__ostream_type& (*__pf)(__ostream_type&)){// _GLIBCXX_RESOLVE_LIB_DEFECTS// DR 60. What is a formatted input function?// The inserters for manipulators are *not* formatted output functions.return __pf(*this);}__ostream_type&operator<<(__ios_type& (*__pf)(__ios_type&)){// _GLIBCXX_RESOLVE_LIB_DEFECTS// DR 60. What is a formatted input function?// The inserters for manipulators are *not* formatted output functions.__pf(*this);return *this;}__ostream_type&operator<<(ios_base& (*__pf) (ios_base&)){// _GLIBCXX_RESOLVE_LIB_DEFECTS// DR 60. What is a formatted input function?// The inserters for manipulators are *not* formatted output functions.__pf(*this);return *this;}//@}//@{/***  @name Inserters**  All the @c operator<< functions (aka <em>formatted output*  functions</em>) have some common behavior.  Each starts by*  constructing a temporary object of type std::basic_ostream::sentry.*  This can have several effects, concluding with the setting of a*  status flag; see the sentry documentation for more.**  If the sentry status is good, the function tries to generate*  whatever data is appropriate for the type of the argument.**  If an exception is thrown during insertion, ios_base::badbit*  will be turned on in the stream's error state without causing an*  ios_base::failure to be thrown.  The original exception will then*  be rethrown.*///@{/***  @brief Integer arithmetic inserters*  @param  __n A variable of builtin integral type.*  @return  @c *this if successful**  These functions use the stream's current locale (specifically, the*  @c num_get facet) to perform numeric formatting.*/__ostream_type&operator<<(long __n){ return _M_insert(__n); }__ostream_type&operator<<(unsigned long __n){ return _M_insert(__n); }__ostream_type&operator<<(bool __n){ return _M_insert(__n); }__ostream_type&operator<<(short __n);__ostream_type&operator<<(unsigned short __n){// _GLIBCXX_RESOLVE_LIB_DEFECTS// 117. basic_ostream uses nonexistent num_put member functions.return _M_insert(static_cast<unsigned long>(__n));}__ostream_type&operator<<(int __n);__ostream_type&operator<<(unsigned int __n){// _GLIBCXX_RESOLVE_LIB_DEFECTS// 117. basic_ostream uses nonexistent num_put member functions.return _M_insert(static_cast<unsigned long>(__n));}#ifdef _GLIBCXX_USE_LONG_LONG__ostream_type&operator<<(long long __n){ return _M_insert(__n); }__ostream_type&operator<<(unsigned long long __n){ return _M_insert(__n); }
#endif//@}//@{/***  @brief  Floating point arithmetic inserters*  @param  __f A variable of builtin floating point type.*  @return  @c *this if successful**  These functions use the stream's current locale (specifically, the*  @c num_get facet) to perform numeric formatting.*/__ostream_type&operator<<(double __f){ return _M_insert(__f); }__ostream_type&operator<<(float __f){// _GLIBCXX_RESOLVE_LIB_DEFECTS// 117. basic_ostream uses nonexistent num_put member functions.return _M_insert(static_cast<double>(__f));}__ostream_type&operator<<(long double __f){ return _M_insert(__f); }//@}/***  @brief  Pointer arithmetic inserters*  @param  __p A variable of pointer type.*  @return  @c *this if successful**  These functions use the stream's current locale (specifically, the*  @c num_get facet) to perform numeric formatting.*/__ostream_type&operator<<(const void* __p){ return _M_insert(__p); }#if __cplusplus >= 201703L__ostream_type&operator<<(nullptr_t){ return *this << "nullptr"; }
#endif/***  @brief  Extracting from another streambuf.*  @param  __sb  A pointer to a streambuf**  This function behaves like one of the basic arithmetic extractors,*  in that it also constructs a sentry object and has the same error*  handling behavior.**  If @p __sb is NULL, the stream will set failbit in its error state.**  Characters are extracted from @p __sb and inserted into @c *this*  until one of the following occurs:**  - the input stream reaches end-of-file,*  - insertion into the output sequence fails (in this case, the*    character that would have been inserted is not extracted), or*  - an exception occurs while getting a character from @p __sb, which*    sets failbit in the error state**  If the function inserts no characters, failbit is set.*/__ostream_type&operator<<(__streambuf_type* __sb);//@}//@{/***  @name Unformatted Output Functions**  All the unformatted output functions have some common behavior.*  Each starts by constructing a temporary object of type*  std::basic_ostream::sentry.  This has several effects, concluding*  with the setting of a status flag; see the sentry documentation*  for more.**  If the sentry status is good, the function tries to generate*  whatever data is appropriate for the type of the argument.**  If an exception is thrown during insertion, ios_base::badbit*  will be turned on in the stream's error state.  If badbit is on in*  the stream's exceptions mask, the exception will be rethrown*  without completing its actions.*//***  @brief  Simple insertion.*  @param  __c  The character to insert.*  @return  *this**  Tries to insert @p __c.**  @note  This function is not overloaded on signed char and*         unsigned char.*/__ostream_type&put(char_type __c);/***  @brief  Core write functionality, without sentry.*  @param  __s  The array to insert.*  @param  __n  Maximum number of characters to insert.*/void_M_write(const char_type* __s, streamsize __n){const streamsize __put = this->rdbuf()->sputn(__s, __n);if (__put != __n)this->setstate(ios_base::badbit);}/***  @brief  Character string insertion.*  @param  __s  The array to insert.*  @param  __n  Maximum number of characters to insert.*  @return  *this**  Characters are copied from @p __s and inserted into the stream until*  one of the following happens:**  - @p __n characters are inserted*  - inserting into the output sequence fails (in this case, badbit*    will be set in the stream's error state)**  @note  This function is not overloaded on signed char and*         unsigned char.*/__ostream_type&write(const char_type* __s, streamsize __n);//@}/***  @brief  Synchronizing the stream buffer.*  @return  *this**  If @c rdbuf() is a null pointer, changes nothing.**  Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,*  sets badbit.*/__ostream_type&flush();/***  @brief  Getting the current write position.*  @return  A file position object.**  If @c fail() is not false, returns @c pos_type(-1) to indicate*  failure.  Otherwise returns @c rdbuf()->pubseekoff(0,cur,out).*/pos_typetellp();/***  @brief  Changing the current write position.*  @param  __pos  A file position object.*  @return  *this**  If @c fail() is not true, calls @c rdbuf()->pubseekpos(pos).  If*  that function fails, sets failbit.*/__ostream_type&seekp(pos_type);/***  @brief  Changing the current write position.*  @param  __off  A file offset object.*  @param  __dir  The direction in which to seek.*  @return  *this**  If @c fail() is not true, calls @c rdbuf()->pubseekoff(off,dir).*  If that function fails, sets failbit.*/__ostream_type&seekp(off_type, ios_base::seekdir);protected:basic_ostream(){ this->init(0); }#if __cplusplus >= 201103L// Non-standard constructor that does not call init()basic_ostream(basic_iostream<_CharT, _Traits>&) { }basic_ostream(const basic_ostream&) = delete;basic_ostream(basic_ostream&& __rhs): __ios_type(){ __ios_type::move(__rhs); }// 27.7.3.3 Assign/swapbasic_ostream& operator=(const basic_ostream&) = delete;basic_ostream&operator=(basic_ostream&& __rhs){swap(__rhs);return *this;}voidswap(basic_ostream& __rhs){ __ios_type::swap(__rhs); }
#endiftemplate<typename _ValueT>__ostream_type&_M_insert(_ValueT __v);};/***  @brief  Performs setup work for output streams.**  Objects of this class are created before all of the standard*  inserters are run.  It is responsible for <em>exception-safe prefix and*  suffix operations</em>.*/template <typename _CharT, typename _Traits>class basic_ostream<_CharT, _Traits>::sentry{// Data Members.bool                 _M_ok;basic_ostream<_CharT, _Traits>&     _M_os;public:/***  @brief  The constructor performs preparatory work.*  @param  __os  The output stream to guard.**  If the stream state is good (@a __os.good() is true), then if the*  stream is tied to another output stream, @c is.tie()->flush()*  is called to synchronize the output sequences.**  If the stream state is still good, then the sentry state becomes*  true (@a okay).*/explicitsentry(basic_ostream<_CharT, _Traits>& __os);#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"/***  @brief  Possibly flushes the stream.**  If @c ios_base::unitbuf is set in @c os.flags(), and*  @c std::uncaught_exception() is true, the sentry destructor calls*  @c flush() on the output stream.*/~sentry(){// XXX MTif (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception()){// Can't call flush directly or else will get into recursive lock.if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)_M_os.setstate(ios_base::badbit);}}
#pragma GCC diagnostic pop/***  @brief  Quick status checking.*  @return  The sentry state.**  For ease of use, sentries may be converted to booleans.  The*  return value is that of the sentry state (true == okay).*/
#if __cplusplus >= 201103Lexplicit
#endifoperator bool() const{ return _M_ok; }};//@{/***  @brief  Character inserters*  @param  __out  An output stream.*  @param  __c  A character.*  @return  out**  Behaves like one of the formatted arithmetic inserters described in*  std::basic_ostream.  After constructing a sentry object with good*  status, this function inserts a single character and any required*  padding (as determined by [22.2.2.2.2]).  @c __out.width(0) is then*  called.**  If @p __c is of type @c char and the character type of the stream is not*  @c char, the character is widened before insertion.*/template<typename _CharT, typename _Traits>inline basic_ostream<_CharT, _Traits>&operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c){ return __ostream_insert(__out, &__c, 1); }template<typename _CharT, typename _Traits>inline basic_ostream<_CharT, _Traits>&operator<<(basic_ostream<_CharT, _Traits>& __out, char __c){ return (__out << __out.widen(__c)); }// Specializationtemplate <class _Traits>inline basic_ostream<char, _Traits>&operator<<(basic_ostream<char, _Traits>& __out, char __c){ return __ostream_insert(__out, &__c, 1); }// Signed and unsignedtemplate<class _Traits>inline basic_ostream<char, _Traits>&operator<<(basic_ostream<char, _Traits>& __out, signed char __c){ return (__out << static_cast<char>(__c)); }template<class _Traits>inline basic_ostream<char, _Traits>&operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c){ return (__out << static_cast<char>(__c)); }//@}//@{/***  @brief  String inserters*  @param  __out  An output stream.*  @param  __s  A character string.*  @return  out*  @pre  @p __s must be a non-NULL pointer**  Behaves like one of the formatted arithmetic inserters described in*  std::basic_ostream.  After constructing a sentry object with good*  status, this function inserts @c traits::length(__s) characters starting*  at @p __s, widened if necessary, followed by any required padding (as*  determined by [22.2.2.2.2]).  @c __out.width(0) is then called.*/template<typename _CharT, typename _Traits>inline basic_ostream<_CharT, _Traits>&operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s){if (!__s)__out.setstate(ios_base::badbit);else__ostream_insert(__out, __s,static_cast<streamsize>(_Traits::length(__s)));return __out;}template<typename _CharT, typename _Traits>basic_ostream<_CharT, _Traits> &operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);// Partial specializationstemplate<class _Traits>inline basic_ostream<char, _Traits>&operator<<(basic_ostream<char, _Traits>& __out, const char* __s){if (!__s)__out.setstate(ios_base::badbit);else__ostream_insert(__out, __s,static_cast<streamsize>(_Traits::length(__s)));return __out;}// Signed and unsignedtemplate<class _Traits>inline basic_ostream<char, _Traits>&operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s){ return (__out << reinterpret_cast<const char*>(__s)); }template<class _Traits>inline basic_ostream<char, _Traits> &operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s){ return (__out << reinterpret_cast<const char*>(__s)); }//@}// Standard basic_ostream manipulators/***  @brief  Write a newline and flush the stream.**  This manipulator is often mistakenly used when a simple newline is*  desired, leading to poor buffering performance.  See*  https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html#io.streambuf.buffering*  for more on this subject.*/template<typename _CharT, typename _Traits>inline basic_ostream<_CharT, _Traits>&endl(basic_ostream<_CharT, _Traits>& __os){ return flush(__os.put(__os.widen('\n'))); }/***  @brief  Write a null character into the output sequence.**  <em>Null character</em> is @c CharT() by definition.  For CharT*  of @c char, this correctly writes the ASCII @c NUL character*  string terminator.*/template<typename _CharT, typename _Traits>inline basic_ostream<_CharT, _Traits>&ends(basic_ostream<_CharT, _Traits>& __os){ return __os.put(_CharT()); }/***  @brief  Flushes the output stream.**  This manipulator simply calls the stream's @c flush() member function.*/template<typename _CharT, typename _Traits>inline basic_ostream<_CharT, _Traits>&flush(basic_ostream<_CharT, _Traits>& __os){ return __os.flush(); }#if __cplusplus >= 201103Ltemplate<typename _Ch, typename _Up>basic_ostream<_Ch, _Up>&__is_convertible_to_basic_ostream_test(basic_ostream<_Ch, _Up>*);template<typename _Tp, typename = void>struct __is_convertible_to_basic_ostream_impl{using __ostream_type = void;};template<typename _Tp>using __do_is_convertible_to_basic_ostream_impl =decltype(__is_convertible_to_basic_ostream_test(declval<typename remove_reference<_Tp>::type*>()));template<typename _Tp>struct __is_convertible_to_basic_ostream_impl<_Tp,__void_t<__do_is_convertible_to_basic_ostream_impl<_Tp>>>{using __ostream_type =__do_is_convertible_to_basic_ostream_impl<_Tp>;};template<typename _Tp>struct __is_convertible_to_basic_ostream: __is_convertible_to_basic_ostream_impl<_Tp>{public:using type = __not_<is_void<typename __is_convertible_to_basic_ostream_impl<_Tp>::__ostream_type>>;constexpr static bool value = type::value;};template<typename _Ostream, typename _Tp, typename = void>struct __is_insertable : false_type {};template<typename _Ostream, typename _Tp>struct __is_insertable<_Ostream, _Tp,__void_t<decltype(declval<_Ostream&>()<< declval<const _Tp&>())>>: true_type {};template<typename _Ostream>using __rvalue_ostream_type =typename __is_convertible_to_basic_ostream<_Ostream>::__ostream_type;/***  @brief  Generic inserter for rvalue stream*  @param  __os  An input stream.*  @param  __x  A reference to the object being inserted.*  @return  os**  This is just a forwarding function to allow insertion to*  rvalue streams since they won't bind to the inserter functions*  that take an lvalue reference.*/template<typename _Ostream, typename _Tp>inlinetypename enable_if<__and_<__not_<is_lvalue_reference<_Ostream>>,__is_convertible_to_basic_ostream<_Ostream>,__is_insertable<__rvalue_ostream_type<_Ostream>,const _Tp&>>::value,__rvalue_ostream_type<_Ostream>>::typeoperator<<(_Ostream&& __os, const _Tp& __x){__rvalue_ostream_type<_Ostream> __ret_os = __os;__ret_os << __x;return __ret_os;}
#endif // C++11_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std#include <bits/ostream.tcc>#endif   /* _GLIBCXX_OSTREAM */

可以看到有700多行。非常多。

istream

istream 库是窄字节输入库。由于代码实在找不到,这里就不放代码了。。。

fstream

对文件进行操作的头文件。

ios

你可以理解为以上那些库(这还没说全,比如 ofstreamwistream 等,太多了)的总共的一个库,就像 iostream 是Java,ios 库是Oracle一样的。注意,这不是进行iOS开发的库,很多人都理解错了。

本文完。整理不易,希望大家支持。

C++ iostream、ostream、istream等标准库都是什么?看完这篇就知道了相关推荐

  1. 企业为什么要制定精益标准工时?看完这篇就懂了!

    现代化程度越高.监管越全面的企业,就会利用精益标准工时去提升效益,用量化的方式去管理企业,从而获得更加广阔的发展空间.那企业为什么要制定精益标准工时?看完这篇就懂了! 一.精益标准工时对生产管理的重要 ...

  2. STM32的printf函数串口重定义(HAL库和标准库都适用)

    1. 打开或创建工程 打开或者创建自己要用到的工程,配置串口相关的GPIO.时钟.波特率等,本次使用STM32CubeMX创建工程,打开串口1,配置波特率为115200,数据位为8,停止位为1,无奇偶 ...

  3. python office库使用_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...

    一.导读 大家好,今天依旧是Python办公自动化基础系列,在之前我们分别详细讲解了 今天本文将基于第三方库pptx,详细讲解如何使用Python操作Office全家桶最后一位--PPT. 二.安装 ...

  4. 看完这篇文章,我奶奶都懂了https的原理

    Http存在的问题 上过网的朋友都知道,网络是非常不安全的.尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵.还有大家平时喜欢用的万能钥匙,等等.那我们平时上网可能会存在哪些风险呢? 1.泄 ...

  5. 有一部龙珠上是打超级计算机的是哪一部,这20部七龙珠剧场版都没全部看完,还好意思说自己是龙珠迷?...

    龙珠动画自1986年首次上映至今已有32余年,这恐怕比许多粉丝的年龄还大! 而在这32年间除了<七龙珠><七龙珠Z><龙珠超>这几部官方主线动画外,龙珠系列还有20 ...

  6. 手机壳鸿蒙,手机壳后面为什么要放钱?好多人都不懂,看完我也放一张

    出门不带钱依然成为很多人的习惯,只要一个手机在手就能行万里路了,这说的是你的银行卡里面"粮食"充足,要不然你光拿个手机潇洒的出门,最后也只能恹恹的回来,所以还是先努力挣钱吧,才有资 ...

  7. 常用的 Python 标准库都有哪些?

    os 操作系统,time 时间,random 随机,pymysql 连接数据库,threading 线程,multiprocessing 进程,queue 队列 第三方库: django 和 flas ...

  8. Python标准库-string模块《未完待续》

    >>> import string >>> s='hello rollen , how are you ' >>> string.capwords ...

  9. 【C标准库】详解fopen函数 一篇让你搞懂fopen函数

    创作不易,感谢支持!‾\underline{创作不易,感谢支持! }创作不易,感谢支持!​ fopen函数 头文件:stdio.h 功能是打开一个文件,其声明格式是: FILE *fopen(cons ...

最新文章

  1. android jason动画,Android 动画之Lottie动画使用
  2. 沈向洋博士:三十年科研路,我踩过的那些坑
  3. python的用途实例-python 星号(*)的多种用途
  4. 二叉树的的前序遍历和后序遍历(题型变种更新中)
  5. 服务器母鸡系统,母鸡云服务器
  6. C# WebBrowser 设置独立的代理
  7. __attribute__编绎属性、关于__init、__initdata、__exit、__exitdata及类似的宏、关于initcall的一些宏定义、__setup宏的来源及使用...
  8. 在javascript中调用java
  9. 人工智能-baidu-aip语音识别(语音转文字)
  10. ubuntu搭建xv6环境
  11. 超级网际搜索(SuperSearch) - 3月30日最新版V5.1.28.94,内置140个搜索引擎
  12. VMware虚拟机使用记录
  13. 深度linux关闭搜狗后没法输入法,Deepin v20无法安装搜狗官方输入法 for Linux,附原因和解决办法...
  14. python的seek用法
  15. 19年12月六级翻译词汇
  16. mysql 语法大全
  17. 各国iPhone5系列最新裸机价格
  18. 分层网络有哪些最新发表的毕业论文呢?
  19. anthony1314的数论小基础
  20. aps助油田服务与设备行业实现数字化

热门文章

  1. Table ‘ecology.e9_para_group_concat_max_len‘ doesn‘t exist
  2. 【shadergraph入门】对材质进行UV操作自发光效果
  3. Markdown随笔
  4. 阿里p6前端面经(全文3w字)
  5. 走进C++程序世界---------雇员工资管理系统
  6. 用python画路飞代码_用python画个月亮_用python画月亮的代码 - CSDN
  7. java二级考点_计算机二级JAVA考试考点知识
  8. HTML网页打包成EXE可执行文件
  9. 100多年前人们心中的2018年:部分预测已成现实 | 回溯
  10. 在MYSQL 自增,默认值,时间默认字段