std::noskipws: #include<ios> or #include<iomanip>?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Bernd Gaertner

    std::noskipws: #include<ios> or #include<iomanip>?

    Dear experts,

    according to the standard, manipulators like noskipws are declared in
    the header ios ([lib.iostreams.b ase]). But when I look at code that is
    around, I usually see #include<iomani pbeing used. What is the correct
    include, and why?

    Thanks in advance for your time!

    Best regards,
    Bernd.
  • Salt_Peter

    #2
    Re: std::noskipws: #include&lt;ios &gt; or #include&lt;iom anip&gt;?

    On Nov 17, 11:20 am, Bernd Gaertner <gaert...@inf.e thz.chwrote:
    Dear experts,
    >
    according to the standard, manipulators like noskipws are declared in
    the header ios ([lib.iostreams.b ase]). But when I look at code that is
    around, I usually see #include<iomani pbeing used. What is the correct
    include, and why?
    >
    Thanks in advance for your time!
    >
    Best regards,
    Bernd.
    The header <iomaniptypical ly has member functions resetiosflags,
    setiosflags, setbase, setfill, setprecision and setw. So it all
    depends what you are doing.

    Assuming you are using std::cout by including <iostream>, and since
    iostream derives from istream/ostream which derive from ios (a diamond
    hierarchy), noskipws doesn't need an include <iomanipunles s you plan
    to use the set/reset members mentioned above.

    You probably saw example code with include <iomanipmainl y because
    the subject at hand was manipulation of streams.

    Comment

    • James Kanze

      #3
      Re: std::noskipws: #include&lt;ios &gt; or #include&lt;iom anip&gt;?

      On Nov 17, 5:20 pm, Bernd Gaertner <gaert...@inf.e thz.chwrote:
      according to the standard, manipulators like noskipws are
      declared in the header ios ([lib.iostreams.b ase]). But when I
      look at code that is around, I usually see #include<iomani p>
      being used. What is the correct include, and why?
      It's rather arbitrary from a user point of view, but
      manipulators which require an argument are declared in
      <iomanip>, and those that don't are declared in <ios>. (There
      are also a few, like endl, which only work on an ostream, and
      are declared in <ostream>.) The reason behind this distinction
      is mainly one of implementation; a manipulator which takes an
      argument requires an additional type, which must be defined; if
      you only include <ios>, you don't get a definition these types.

      --
      James Kanze (GABI Software) email:james.kan ze@gmail.com
      Conseils en informatique orientée objet/
      Beratung in objektorientier ter Datenverarbeitu ng
      9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

      Comment

      • Bernd Gaertner

        #4
        Re: std::noskipws: #include&lt;ios &gt; or #include&lt;iom anip&gt;?

        Salt_Peter wrote:
        Assuming you are using std::cout by including <iostream>, and since
        iostream derives from istream/ostream which derive from ios (a diamond
        hierarchy), noskipws doesn't need an include <iomanipunles s you plan
        to use the set/reset members mentioned above.
        I'm doing std::cin >std::noskipw s, and I ran across a platform where
        #include<iostre amdoesn't suffice to do this. With an additional
        #include<iosit worked. But according to what you write above, ios
        should be included with iostream, meaning that the platform is buggy. Or
        is it not allowed to infer this from the aforementioned diamond hierarchy?

        Thanks,
        Bernd.

        Comment

        • Bernd Gaertner

          #5
          Re: std::noskipws: #include&lt;ios &gt; or #include&lt;iom anip&gt;?

          James Kanze wrote:
          It's rather arbitrary from a user point of view, but
          manipulators which require an argument are declared in
          <iomanip>, and those that don't are declared in <ios>.
          Thanks. This seems to mean that for example the following code (you find
          many similar things on the web) actually uses the wrong include:

          #include <iostream>
          #include <iomanip // for noskipws - (no skip whitespace)

          char s;

          int main()
          {
          std::cin >std::noskipw s;
          while (std::cin >s)
          {
          std::cout << s;
          }
          return 0;
          }

          Best,
          Bernd.

          Comment

          • Bo Persson

            #6
            Re: std::noskipws: #include&lt;ios &gt; or #include&lt;iom anip&gt;?

            Bernd Gaertner wrote:
            Salt_Peter wrote:
            >Assuming you are using std::cout by including <iostream>, and since
            >iostream derives from istream/ostream which derive from ios (a
            >diamond hierarchy), noskipws doesn't need an include <iomanip>
            >unless you plan to use the set/reset members mentioned above.
            >
            I'm doing std::cin >std::noskipw s, and I ran across a platform
            where #include<iostre amdoesn't suffice to do this. With an
            additional #include<iosit worked. But according to what you write
            above, ios should be included with iostream, meaning that the
            platform is buggy. Or is it not allowed to infer this from the
            aforementioned diamond hierarchy?
            The current standard does not specify which headers should be included
            by <iostream>, so it is not a bug. Technically it is enough to include
            <iosfwdto be able to declare (but not define) the streams.


            Bo Persson


            Comment

            • James Kanze

              #7
              Re: std::noskipws: #include&lt;ios &gt; or #include&lt;iom anip&gt;?

              On Nov 18, 6:29 pm, Bernd Gaertner <gaert...@inf.e thz.chwrote:
              James Kanze wrote:
              It's rather arbitrary from a user point of view, but
              manipulators which require an argument are declared in
              <iomanip>, and those that don't are declared in <ios>.
              Thanks. This seems to mean that for example the following code
              (you find many similar things on the web) actually uses the
              wrong include:
              #include <iostream>
              #include <iomanip   // for noskipws - (no skip whitespace)
              char s;
              int main()
              {
                      std::cin >std::noskipw s;
                      while (std::cin >s)
                      {
                              std::cout << s;
                      }
                      return 0;
              }
              Well, the comment is wrong, and the include of <iomanipisn't
              necessary here. But it doesn't hurt, and I can imagine some
              house rules just saying to include it anytime you use a
              manipulator, rather than having the developers have to learn the
              detailed rule; it doesn't hurt. (Of course, <ioswill be
              included indirectly by <iostream>, so there's no risk of the
              manipulator not being defined.)

              --
              James Kanze (GABI Software) email:james.kan ze@gmail.com
              Conseils en informatique orientée objet/
              Beratung in objektorientier ter Datenverarbeitu ng
              9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

              Comment

              Working...