C++输入输出和文件

C++文件输入输出,看这一篇就够了 C++文件输入输出,看这一篇就够了 1 简介 1.1 继承关系 基类->继承类: ​ ios->ostream->ofstream ​ ios->istream->ifstream ​ iostream->fstream(还继承了两个缓冲区,一个用于输入,一个用于输出)(此类用于文件I/O的同步,即协调地移动输入缓冲区的输入指针和输出缓冲区的输出指针)(输入输出模式时使用fstream类) 1.2 流 C++程序将文件输入和输出看作字符流;对于输入来说,程序从输入流中抽取 阅读详情


一. 流, 缓冲区和iostream文件

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 在这里插入图片描述

  • streambuf 类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法;

  • ios_base 类表示流的一般特征,如是否可读取、是二进制流还是文本流等;

  • ios 类基于ios_base,其中包括了一个指向streambuf对象的指针成员;

  • ostream 类是从ios类派生而来的,提供了输出方法;

  • istream 类也是从ios类派生而来的,提供了输入方法;

  • iostream 类是基于istream和ostream类的,因此继承了输入方法和输出方法。

  • cin对象对应于标准输入流。在默认情况下,这个流被关联到标准输入设备(通常为键盘)。wcin对象与此类似,但处理的是wchar_t类型。

  • cout对象与标准输出流相对应。在默认情况下,这个流被关联到标准输出设备(通常为显示器)。wcout对象与此类似,但处理的是wchar_t类型。

  • cerr对象与标准错误流相对应,可用于显示错误消息。在默认情况下,这个流被关联到标准输出设备(通常为显示器)。这个流没有被缓冲,这意味着信息将被直接发送给屏幕,而不会等到缓冲区填满或新的换行符。wcerr对象与此类似,但处理的是wchar_t类型。

  • clog对象也对应着标准错误流。在默认情况下,这个流被关联到标准输出设备

  • C++的iostream类库管理了很多细节。例如,在程序中包含iostream文件将自动创建8个流对象(4个用于窄字符流,4个用于宽字符)
  • ios_base类中的成员和方法以前位于ios类中。现在,ios_base是ios的基类。在新系统中,ios是包含char和wchar_t实体化的模块板,而ios_base包含了非模板特性。

二. 使用cout进行输出

1. 用cout进行格式化

[1].修改显示时使用的计数系统

  • hex(cout);
    //或者
    cout << hex;
    //示例:
    cout << hex <<10; //以16进制格式输出十进制10

    完成上述设置后,程序将以十六进制形式打印整数值,直到将格式状态设置为其他选项为止。
    >.hex不是成员函数
    oct dec 对应八进制和十进制 用法同上

[2].调整字段宽度

  • int width();
    int width(int i);

    第一种格式返回字段宽度的当前设置;第二种格式将字段宽度设置为 i 个空格,并返回以前的字段宽度值。这使得能够保存以前的值,以便以后恢复宽度值时使用

  • width()方法只影响显示的下一个项目,然后字段宽度将恢复为默认值。

  • 由于width()是成员函数, 因此必须使用对象来调用它(这里是cout) .

    cout << '#';
    cout.width(12);
    cout << 12 << "#" << 24 << "#\n";
    

    输出:

    #     12#24#
    
  • 默认右对齐

  • C++永远不会截短数据,如果在字段宽度为2的时候打印7个字段的值, C++将增宽字段, 以容纳该数据. C++视内容重于形式.

[3].填充字符

  • cout.fill(‘*’); //用 * 填充空白字符

  • 示例:

    cout << '#';
    cout.width(12);
    cout.fill('*');
    cout << 12 << "#" << 24 << "#\n";
    cout.width(5);
    cout << "%%%" << endl;
    

    输出:

    #*****12#24#
    **%%%
    
  • 将一直有效, 直到更改 .

[4].设置浮点数的显示精度

  • cout.precision(2);

  • 在默认模式下, 它指的是总位数; 在定点模式和科学计数模式下,指的是小数点后面的位数(稍后讨论) C++的默认精度为6位 (但末尾的0不显示)

  • 一直有效, 直到更改.

  • 示例:

    #include <iostream>
    int main()
    {
        using std::cout;
        float price1 = 20.40;
        float price2 = 1.9 + 8.0 / 9.0;
        cout << "\"Furry Friends\" is $" << price1 << "!\n";
        cout << "\"Fiery Fiends\" is $" << price2 << "!\n";
    
        cout.precision(2);
        cout << "\"Furry Friends\" is $" << price1 << "!\n";
        cout << "\"Fiery Fiends\" is $" << price2 << "!\n";
        return 0;
    }
    

    输出:

    "Furry Friends" is $20.4!
    "Fiery Fiends" is $2.78889!
    "Furry Friends" is $20!
    "Fiery Fiends" is $2.8!
    

[5].打印末尾的0和小数点

  • 有时候呢保留末尾的0将更加美观, 比如 $20.40 比 $20.4 更加美观
    ios_base类提供了一个函数setf (用于set 标记) 这个类还定义了多个静态常量,可以作为该函数的参数

    cout.setf(ios_base::showpoint);
    
  • 上述语句将导致末尾的0被显示出来; 如果使用默认精度为6, 那么2.00 将被显示为2.00000

[6].再谈setf

  • setf()函数有两个原形. 第一个为:

    fmtflags
    setf(fmtflags __fmtfl)
    {
      fmtflags __old = _M_flags; // _M_flags 作为ios_base的成员变量,用来记录当前的标记
      _M_flags |= __fmtfl;
      return __old;   //返回以前的标记设置;
    }
    

    fmtflags是这样被定义的类型: typedef _Ios_Fmtflags fmtflags;
    _Ios_Fmtflags 是这样被定义的:

    enum _Ios_Fmtflags 
      { 
        _S_boolalpha 	= 1L << 0,
        _S_dec 		= 1L << 1,
        _S_fixed 		= 1L << 2,
        _S_hex 		= 1L << 3,
        _S_internal 	= 1L << 4,
        _S_left 		= 1L << 5,
        _S_oct 		= 1L << 6,
        _S_right 		= 1L << 7,
        _S_scientific 	= 1L << 8,
        _S_showbase 	= 1L << 9,
        _S_showpoint 	= 1L << 10,
        _S_showpos 	= 1L << 11,
        _S_skipws 	= 1L << 12,
        _S_unitbuf 	= 1L << 13,
        _S_uppercase 	= 1L << 14,
        _S_adjustfield 	= _S_left | _S_right | _S_internal,
        _S_basefield 	= _S_dec | _S_oct | _S_hex,
        _S_floatfield 	= _S_scientific | _S_fixed,
        _S_ios_fmtflags_end = 1L << 16,
        _S_ios_fmtflags_max = __INT_MAX__,
        _S_ios_fmtflags_min = ~__INT_MAX__
      };
    

    对位进行跟踪好像很乏味, 然而我不必做这项工作, ios_base类提供了代表位值的常量:

    常 量

    含 义

    ios_base ::boolalpha

    输入和输出bool值,可以为true或false

    ios_base ::showbase

    对于输出,使用C++基数前缀(0,0x)

    ios_base ::showpoint

    显示末尾的小数点

    ios_base ::uppercase

    对于16进制输出,使用大写字母,E表示法

    ios_base ::showpos

    在正数前面加上+

  • 第二个seft()函数原形接受两个参数,并返回以前的设置:

    fmtflags
    setf(fmtflags __fmtfl, fmtflags __mask)
    {//__mask称为掩码 通常这块位域全部填充1;
      fmtflags __old = _M_flags;   //_M_flags中记录着上次的标记情况
      _M_flags &= ~__mask;         //把_M_flags中的关于这块位域的标志位清零
      _M_flags |= (__fmtfl & __mask);  //两个为1结果才为1 在这块标志位域内去除其他标志 最后添加到总标记_M_flags里
      return __old;
    }
    

    第一参数和以前一样,也是一个包含了所需设置的fmtflags值。第二参数指出要清除第一个参数中的哪些位。假定以将第3位设置为1表示以10为基数,将第4位设置为1表示以8为基数,将第5位设置为1表示以16为基数。假设输出是以10为基数的,而要将它设置为以16为基数,则不仅需要将第5位设置为1,还需要将第3位设置为0一一这叫作清除位(清除位)。
    下面的函数调用与使用16进制控制符作用相同:

    cout.setf(ios_base::hex, ios_base::basefield);
    

    对位进行跟踪好像很乏味, 然而我不必做这项工作, ios_base类提供了一些掩码的常量:

    第二个参数

    第一个参数

    含 义

    ios_base ::basefield

    ios_base ::dec

    使用基数10

    ios_base ::oct

    使用基数8

    ios_base ::hex

    使用基数16

    ios_base ::floatfield

    ios_base ::fixed

    使用定点计数法

    ios_base ::scientific

    使用科学计数法

    ios_base ::adjustfield

    ios_base ::left

    使用左对齐

    ios_base ::right

    使用右对齐

    ios_base ::internal

    符号或基数前缀左对齐,值右对齐

    在C++标准中,定点表示法和科学表示法都有下面两个特征:

    • 精度表示的是小数位数, 而不是总位数;
    • 显示末尾的0;
  • 调用setf()的效果可以通过 unsetf()消除

    void
    unsetf(fmtflags __mask)
    { _M_flags &= ~__mask; }//不管是掩码还是单个标志位的 都适用
    

    示例:

    cout.unsetf(ios_base::floatfield); // go to default mode
    

    如果已知cout处于定点状态,则可以使用参数ios_base::fxed调用函数unsetf()来切换到默认模式。而无论cout的当前状态如何,使用参数ios_base::floatfield调用函数unsetf()都将切换到默认模式,是一种更好的选择
    其他方法:

    cout.setf(0, ios_base::floatfield); // go to default mode
    

[7].标准控制符

  • C++提供了多个控制符,能够调用setf(),并自动提供正确的参数。
    前面介绍过hex oct dec 用法都类似
    例如,下面的语句使用左对齐和定点表示法:

    cout << left << fixed;
    

    下面罗列出一些标准控制符

    控 制 符

    调 用

    boolalpha

    setf(ios_base::boolalpha)

    noboolalpha

    unsetf(ios_base::boolalpha)

    showbase

    setf(ios_base::showbase)

    noshowbase

    unsetf(ios_base::showbase)

    showpoint

    setf(ios_base::showpoint)

    noshowpoint

    unsetf(ios_base::showpoint)

    showpos

    setf(ios_base::showpos)

    noshowpos

    unsetf(ios_base::showpos)

    uppercase

    setf(ios_base::uppercase)

    nouppercase

    unsetf(ios_base::uppercase)

    internal

    setf(ios_base::internal,ios_base::adjustfield)

    left

    setf(ios_base::left,ios_base::adjustfield)

    right

    setf(ios_base::right,ios_base::adjustfield)

    dec

    setf(ios_base::dec,ios_base::basefield)

    hex

    setf(ios_base::hex,ios_base::basefield)

    oct

    setf(ios_base::oct,ios_base::basefield)

    fixed

    setf(ios_base::fixed,ios_base::floatfield)

    scientific

    setf(ios_base::scientific,ios_base::floatfield)

    如果你的系统不支持, 仍然可以使用 setf();

[8]. 头文件iomanip

  • 有时候使用cout.fill(‘*’); cout.precision(5); cout.width(3); 这样使用不太方便
    C++在iomanip中提供了一些其他的控制符, 如第 [7] 小结那样, 表示起来更方便, 只是这些控制符带参数
    3个最常用的控制符分别是setprecision() setfill() setw() 对参数的用法如同上面三个
    示例:

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    int main()
    {
        using namespace std;
        // use new standard manipulators
        cout << fixed << right;
    
        // use iomanip manipulators
        cout << setw(6) << "N" << setw(14) << "square root"
             << setw(15) << "fourth root\n";
    
        double root;
        for (int n = 10; n <= 100; n += 10)
        {
            root = sqrt(double(n));
            cout << setw(6) << setfill('.') << n << setfill(' ')
                 << setw(12) << setprecision(3) << root
                 << setw(14) << setprecision(4) << sqrt(root)
                 << endl;
        }
        system("pause");
        return 0;
    }
    

    输出:

         N   square root   fourth root
    ....10       3.162        1.7783
    ....20       4.472        2.1147
    ....30       5.477        2.3403
    ....40       6.325        2.5149
    ....50       7.071        2.6591
    ....60       7.746        2.7832
    ....70       8.367        2.8925
    ....80       8.944        2.9907
    ....90       9.487        3.0801
    ...100      10.000        3.1623
    Press any key to continue . . .
    

2. 刷新输出缓冲区

  • 如果实现不能在所希望时刷新输出,可以使用两个控制符中的一个来强行进行刷新。控制符flush刷新缓冲区,而控制符endl刷新缓冲区并插入一个换行符.

    cout << "Hello, good-looking! " << flush; //or flush(cout);
    cout << "Wait just a moment, please." << endl;
    

三. 使用cin进行输入

1. cin>>如何检查输入

  • cin>>查看输入流时跳过并丢弃开头的空白(空格,制表符和换行符), 直到遇到非空白字符.

  • 非单字符情况下 它读取 从非空白字符开始 到 与目标类型不匹配(边界符不算)的第一个字符之间 的 全部内容

  • 后面的空格被视为边界符并留在输入流, 下一个cin>> 又遵循第一条规则

  • 所以连续使用>>时,像是:以空格为分隔符 分别存储到各变量 (抽取并丢弃空格)

  • 使用示例:

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    int main()
    {
        using namespace std;
        cout << "Enter numbers: ";
        int input;
        int residual;
        cin >> input;
        cout << "input = " << input << endl;
        cin >> residual;
        cout << "residual = " <<  residual << endl;
        system("pause");
        return 0;
    }
    

    正常输入时的情况:

    Enter numbers: 210 10
    input = 210
    residual = 10
    Press any key to continue . . .

    • 第二个cin不会等待用户输入, 而是抽取上次残留在输入流中的10

    非适当输入的情况:

    Enter numbers: 1230a
    input = 1230
    residual = 0
    Press any key to continue . . .

    • 最后一个可接受的字符是0, a将留在输入流中, 下一个cin语句将从这里读取.
    • 读取时发现不符合要求, 返回0 并设置流状态;

2. 流状态

  • cin或cout对象包含一个描述流状态(流状态)的数据成员(从ios_base类那里继承的)。流状态(被定义为iostate类型,而iostate是一种bitmask类型)。3个ios_base元素组成:eofbit、badbit或failbit,其中每个元素都是一位,可以是1或0。当cin操作到达文件未尾时,它将设置eofbit,当cin操作未能读取到预期的字符时(像前一个例子那样),它将设置failbit。I/O失败(如试图读取不可访问的文件或试图写入开启写保护的磁盘),也可能将failbit设置为1。在一些无法诊断的失败破坏流时,badbit元素将被设置(实现没有必要就哪些情况下设置failbit,哪些情况下设置badbit达成一致)。当全部3个状态位都设置为0时,说明一切顺利。程序可以检查流状态的。这种信息来决定下一步做什么。

  • 这个表述流状态的成员在ios_base.h被定义为 iostate _M_streambuf_state;

  • iostate 类型被定义为typedef _Ios_Iostate iostate

    enum _Ios_Iostate
      { 
        _S_goodbit 		= 0,
        _S_badbit 		= 1L << 0,
        _S_eofbit 		= 1L << 1,
        _S_failbit		= 1L << 2,
        _S_ios_iostate_end = 1L << 16,
        _S_ios_iostate_max = __INT_MAX__,
        _S_ios_iostate_min = ~__INT_MAX__
      };
    
  • cin或cout对象包含描述各种流状态(流状态)的静态常量(从ios_base类那里继承的)

    static const iostate badbit =	_S_badbit;
    static const iostate eofbit =	_S_eofbit;
    static const iostate failbit =	_S_failbit;
    static const iostate goodbit =	_S_goodbit;
    
  • 下表列出了这些位和一些报告或改变流状态的ios_base方法。

    成 员描 述
    eofbit如果到达文件尾,则_M_streambuf_state 中表示该流状态的bit位设置为1 (下面同理简写)
    badbit如果流被破坏,则设置为1;例如,文件读取错误
    failbit如果输入操作未能读取预期的字符或输出操作没有写入预期的字符,则设置为1
    goodbit另一种表示0的方法
    good()如果流可以使用(所有的位都被清除),则返回true
    eof()如果eofbit被设置,则返回true
    bad()如果badbit被设置,则返回true
    fail()如果badbit或failbit被设置,则返回true
    rdstate()返回流状态 (_M_streambuf_state)
    exceptions()返回一个位掩码,指出哪些标记导致异常被引发
    exceptions(isostate ex)设置哪些状态将导致clear()引发异常;例如,如果ex是eofbit,则如果eofbit被设置,clear()将引发异常
    clear(iostate s)将流状态设置为s;s的默认值为0(goodbit);如果(rdstate()& exceptions())为true,则引发异常basic_ios::failure
    setstate(iostate s)调用clear(rdstate()|s)。这将设置与s中设置的位对应的流状态位,其他流状态位保持不变
  • 设置流状态位有一个非常重要的后果:流将对后面的输入或输出关闭
    如果希望程序在流状态位被设置后能够读取后面的输入,就必须将流状态重置为良好。这可以通过调用clear()方法来实现

[1]. 设置流状态

  • 下面的调用将使用默认参数0,将三个状态位全部归0 (eofbit、badbit和failbit)

    clear();
    
  • 下面的调用将状态设置为eofbit 其他两个状态位被清除

    clear(ios_base::eofbit);
    
  • 你也可以这样调用:下面两个状态位被设置 其他被清除

    clear(ios_base::eofbit | ios_base::badbit);
    
  • 而setstate()方法只影响其参数中的位。因此,下面的调用将设置eofbit,而不会影响其他位:

    setstate(ios_base::eofbit);
    
  • setstate() 函数原形:

    void
    setstate(iostate __state)
    { this->clear(this->rdstate() | __state); }
    

[2]. I/O和异常

  • exceptions(isostate ex) 原形:

    void
    exceptions(iostate __except)
    {
      _M_exception = __except;
      this->clear(_M_streambuf_state); //当即就确认是否有相应标志位被设置
    }
    
  • exceptions() 原形:

    iostate
    exceptions() const
    { return _M_exception; }
    
  • clear(iostate s) 函数体:

    void
    clear(iostate __state)
    {
      if (this->rdbuf())    //结果通常为true
    _M_streambuf_state = __state;
      else
    _M_streambuf_state = __state | badbit;
      if (this->exceptions() & this->rdstate())
    __throw_ios_failure(__N("basic_ios::clear"));
    }
    
  • _M_exception 的默认设置为 goodbit, 也就是说默认不会抛出异常.
    但重载的 exceptions(iostate) 函数能够控制其行为
    如果 (_M_exception & _M_streambuf_state)为 true, clear()将引发ios_base::failure异常
    ios_base::failure 类是从 std::exceptions 类派生而来的, 因此包含一个 what() 方法

  • 示例:

    #include <iostream>
    #include <exception>
    int main()
    {
        using namespace std;
        // have failbit cause an exception to be thrown
        cin.exceptions(ios_base::failbit);
        cout << "Enter numbers: ";
        int input;
        try {
            while (cin >> input); 
        } catch(ios_base::failure & bf)
        {
            cout << bf.what() << endl;
            cout << "O! the horror!\n";
        }
        return 0;
    }
    

    运行:

    Enter numbers: 10a
    basic_ios::clear: iostream error
    O! the horror!

[3]. 流状态的影响

  • 只有在流状态良好(所有的位都被清除)的情况下,下面的测试才返回true;

    while(cin>>input);
    
  • 如果测试失败,可以用 eof() fail() bad() 来判断可能的原因

  • 用 while(cin.get() != ‘\n’) 清除输入流残留的部分 (在你输入回车它才能恢复挂起状态时可用)

  • 用clear()来重新打开流

    int input, sum;
    while (cin >> input)
    {
        sum += input;
    }
    cout << "Last value entered = " << input << endl;
    cout << "Sum = " << sum << endl;
    
    if (cin.fail() && !cin.eof() ) // failed because of mismatched input
    {
        cout << "cin.fail():true" << endl;
        cin.clear(); // reset stream state
        while (cin.get() != '\n')
        {
            continue;    // get rid of bad input
        }
    }
    else // else bail out
    {
        cout << "I cannot go on!\n";
        system("pause");
        exit(1);
    }
    cout << "Now enter a new number: ";
    cin >> input; // will work now
    system("pause");
    

3. 其他istream类方法

[1]. 单字符输入

  • 特 征

    cin.get(ch)

    ch = cin.get()

    传输输入字符的方法

    赋给参数ch

    将函数返回值赋给ch

    字符输入时函数的返回值

    指向istream对象的引用

    字符编码(int值)

    达到文件尾时函数的返回值

    转换为false

    EOF

  • get(char&)和get(void) 会抽取空白字符

[2]. 字符串输入

  • istream & get(char *, int, char);
    istream & get(char *, int);
    istream & getline(char *, int, char);
    istream & getline(char *, int);
    
  • 第一个参数是用于放置输入字符串的内存单元的地址。第二个参数比实际要读取的最大字符数大1(另外的一个字符用于存储结尾的空字符,以便将输入存储为一个字符串) 。第三个参数指定使用边界符的字符,**只有两个参数的版本将换行符设置为边界符。**上述函数都读取最大数目的字符或遇到换行符后

  • 字符串 get() 和 getline() 的主要区别在于,
    字符串 get() 不会将 边界符 放入第一个参数内, 而是留在输入流中
    而 getline() 抽取并丢弃 边界符(如果到了边界)

  • 示例:

    #include <iostream>
    #include <exception>
    int main()
    {
        using namespace std;
        int input, sum;
        char ch = -1;
        cout << "Now enter: ";
    
        char line[50];
        cin.getline(line, 50, '$'); //设置边界符为 $
        cin.get(ch);
        if (ch == '\n')
        {
            cout << "\\n" << endl;
        }
        else if (ch == ' ')
        {
            cout << "space" << endl;
        }
        else
        {
            cout << ch << endl;
        }
        cout << line << endl;
        system("pause");
        return 0;
    }
    

    运行:
    >.加粗的部分为用户输入的内容

    Now enter:abcde
    fgh$zsm

    z
    abcde
    fgh
    Press any key to continue . . .

    如果把上面代码中的 getline 换成 get 并输入同样的内容:

    Now enter:abcde
    fgh$zsm

    $
    abcde
    fgh
    Press any key to continue . . .

  • **ignore()**有两个参数, 第一个指定要读取的最大字符数, 第二个用作边界符;
    抽取输入流中的你指定的字符个数, 连同你指定的边界符一起丢弃(如果到了边界);

    istream & ignore(int = 1, int = EOF);
    

[3]. 意外字符串输入

  • 如果调用 字符串get() 时传入空值(直接输入回车 或边界符再回车) 它们使用setstate()设置failbit
  • 空值并不会导致 getline()设置 failbit

    方 法

    行 为

    getline(char *, int)

    如果没有读取任何字符(但换行符被视为读取了一个字符(尽管不会放入第一个参数中)),则设置failbit
    如果读取了最大数目的字符,且行中还有其他字符,则设置failbit

    get(char *, int)

    如果没有读取任何字符,则设置failbit

[4]. 其他方法

  • peek() gcount() putback()
  • peek() 返回输入流中的下一个字符, 但不抽取输入流中的字符
  • gcount() 返回最后一个非格式化抽取方法读取的字符数
    这意味着字符是由get() getline() ignore() read()方法读取的, 而不是抽取运算符>>读取的
  • putback() 在输入流前端插入一个字符

四. 文件输入和输出

1. 简单的文件I/O

  • 要让程序写入文件, 必须这样做:

    1. 创建 一个 ofstream 对像来管理输出流;
    2. 将该对象与特定的文件关联起来;
    3. 像使用cout那样使用该对象, 唯一的不同是输出将进入文件, 而不是屏幕;
    //two statement
    ofstream fout; // create an ofstream object named fout
    fout.open("jar.txt"); // associate fout with jar.txt
    //one statement
    ofstream fout("jar.txt"); // create fout object, associate it with jar.txt
    //以使用cout的方式使用fout
    fout << "Dull Data";
    

    warning :以默认模式打开文件进行输出将自动把文件的长度截短为零,这相当于删除已有内容;

  • 读取文件与写入文件类似:

    // two statements
    ifstream fin; // create ifstream object called fin
    fin.open("jellyjar.txt");    // open jellyjar.txt for reading
    // one statement
    ifstream fis("jamjar.txt"); // create fis and associate with jamjar.txt
    

    现在可以像使用 cin 那样使用 fin 或 fis

    char ch;
    fin >> ch;            // read a character from the jellyjar.txt file
    char buf[80];
    fin >> buf;           // read a word from the file
    fin.getline(buf, 80); // read a line from the file
    string line;
    getline(fin, line);   // read from a file to a string object
    

    使用close方法来显式的关闭到文件的连接:

    fout.close(); // close output connection to file
    fin.close();  // close input connection to file
    

    关闭这样的连接并不会删除流,而只是断开流到文件的连接。然而,流管理装置仍被保留。例如,fin对象与它管理的输入缓冲区;

  • 这里有一个简单的例子:

    #include <iostream> // not needed for many systems
    #include <fstream>
    #include <string>
    
    int main()
    {
        using namespace std;
        string filename;
    
        cout << "Enter name for new file: ";
        cin >> filename;
    
        // create output stream object for new file and call it fout
        ofstream fout(filename.c_str());
    
        fout << "For your eyes only!\n";       // write to file
        cout << "Enter your secret number: "; // write to screen
        float secret;
        cin >> secret;
        fout << "Your secret number is " << secret << endl;
        fout.close(); // close file
    
        // create input stream object for new file and call it fin
        ifstream fin(filename.c_str());
        cout << "Here are the contents of " << filename << ":\n";
        char ch;
        while (fin.get(ch)) // read character from file and
        {
            cout << ch;    // write it to screen
        }
        cout << "Done\n";
        fin.close();
        system("pause);
        return 0;
    }
    

2. 文件模式

  • 无论是使用文件名初始化流对象, 还是使用open方法, 都可以提供指定文件模式的第二个参数

    ifstream fin("banjo", mode1); // constructor with mode argument
    ofstream fout();
    fout.open("harp", mode2);     // open() with mode arguments
    

    常 量

    含 义

    ios_base::in

    打开文件,以便读取

    ios_base::out

    打开文件,以便写入

    ios_base::ate

    打开文件,并移到文件尾

    ios_base::app

    追加到文件尾

    ios_base::trunc

    如果文件存在,则截短文件

    ios_base::binary

    二进制文件

    C++和C的文件打开模式

    C++模式

    C模式

    含 义

    ios_base :: in

    "r"

    打开以读取

    ios_base :: out

    "w"

    等价于ios_base :: out | ios_base :: trunc

    ios_base :: out | ios_base :: trunc

    "w"

    打开以写入,如果已经存在,则截短文件

    ios_base :: out | ios_base :: app

    "a"

    打开以写入,只追加

    ios_base :: in | ios_base :: out

    "r+"

    打开以读写,在文件允许的位置写入

    ios_base :: in | ios_base :: out | ios_base::trunc

    "w+"

    打开以读写,如果已经存在,则首先截短文件

    c++mode | ios_base :: binary

    "cmodeb"

    以C++mode(或相应的cmode)和二进制模式打开;例如,ios_base :: in | ios_base :: binary成为“rb”

    c++mode | ios_base :: ate

    "cmode"

    以指定的模式打开,并移到文件尾。C使用一个独立的函数调用,而不是模式编码。例如,ios_base :: in | ios_base :: ate被转换为“r”模式和C函数调用fseek(file, 0, SEEK_END)

    没有列出的组合,如ios_base::in | ios_base::trunc,将禁止文件被打开。 is_open() 方法可检测这种故障

  • 流状态检查和 is_open()

    • 流状态前边已经将过了
    • 新的C++实现提供了一种更好的检查文件是否被打开的方法——is_open()方法;
  • 二进制文件

    • cout.write() 逐字节地复制数据, 而不进行任何转换
    • read()和write()成员函数的功能是相反的。请用read()来恢复用write()写入的数据

3. 随机存取

  • 随机存取指的是直接移动(不是依次移动)到文件的任何位置。

  • 接下来,需要一种在文件中移动的方式。fstream类继承了两个方法:seekg()和seekp(),​​首先将输出指针移到指定的文件位置,稍后将输出指针移到指定的位置的文件位置(实际上,由于fstream类使用缓冲区来存储中间数据 因此,指针指向的是缓冲区中的位置,而不是实际的文件)。也可以将seekg()ifstream对象,将seep()用于oftream对象。下面是seekg()的原型:

    basic_istream<charT,traits>& seekg(off_type, ios_base::seekdir);
    basic_istream<charT,traits>& seekg(pos_type);
    

    对于char类型的模板具体化, 上面两个原形等同于下面的代码:

    istream & seekg(streamoff, ios_base::seekdir);
    istream & seekg(streampos);
    

    第一个原型定位到离第二个参数指定的文件位置特定距离(单位为字节)的位置;第二个原型定位到离文件开头特定距离(单位为字节)的位置.
    ios_base::seekdir 有三个可能的值:
    ios_base::beg : 相对于文件开始处的偏移量
    ios_base::cur : 相对于当前位置
    ios_base::end : 相对于文件尾

    fin.seekg(30, ios_base::beg); // 30 bytes beyond the beginning
    fin.seekg(-1, ios_base::cur); // back up one byte
    fin.seekg(0, ios_base::end);  // go to the end of the file
    
  • 如果要检查文件指针的当前位置,则对于输入流,可以使用 tellg() 方法,对于输出流,可以使用 tellp() 查看。它们都返回一个表示当前位置的streampos值(以字节为单位,从文件开始处算起) 。创建fstream对象时,输入指针和输出指针将前一后地移动,因此tellg(0)和tellp()返回的值相同。但是,如果使用istream对象来管理输入流,而使用ostream对象来管理同一个文件的输出流,则输入指针和输出指针将各自独立地移动,因此tellg0和tellp()将返回不同的值。

  • 使用临时文件

    • 开发应用程序时,经常需要使用临时文件,这种文件的存在是短暂的,必须受程序控制。您是否考虑过,在C++中如何使用临时文件呢?创建临时文件、复制另一个文件的内容并删除文件其实很简单。首先,需要为临时文件制定一个命名方案,但如何确保每个文件都被指定了实验的文件名呢?cstdio中声明的tmpnam()标准函数可以帮助您

      char* tmpnam( char* pszName );
      
    • tmpnam()函数创建一个临时文件名,将它放在pszName指向的C风格字符串中。常量L_tmpnam和TMP_MAX(两者都是在cstdio中定义的)限制了文件名包含的字符数以及在确保当前目录中不生成重复文件名的情况下tmpnam()可被调用的最多次数。下面是生成10个临时文件名的代码。

      #include <cstdio>
      #include <iostream>
      
      int main()
      {
          using namespace std;
          cout << "This system can generate up to " << TMP_MAX
               << " temporary names of up to " << L_tmpnam
               << " characters.\n";
          char pszName[ L_tmpnam ] = {'\0'};
          cout << "Here are ten names:\n";
          for( int i=0; 10 > i; i++ )
          {
              tmpnam( pszName );
              cout << pszName << endl;
          }
          return 0;
      }
      

      更具体地说,使用tmpnam()可以生成TMP_NAM个不同的文件名,其中每个文件名包含的字符不超过L_tmpnam个。

4. 内核格式化

  •     iostream族 (family) 支持程序与终端之间的I/O, 而fstream族使用相同的接口提供程序和文件之间的I/O. C++库还提供了 sstream 族, 他们使用相同的接口提供程序和string 对象之间的I/O.

  •     头文件sstream定义了一个从ostream类派生而来的ostringstream类 (还有一个基于wostream的wostringstream类, 这个类用于宽字符集). 如果创建了一个ostringstream对象, 则可以将信息写入其中, 它将存储这些信息. 可以将可用于cout的方法用于ostringstream对象. 也就是说,可以这样:

    ostringstream outstr;
    double price = 380.0;
    char * ps = " for a copy of the ISO/EIC C++ standard!";
    outstr.precision(2);
    outstr << fixed;
    outstr << "Pay only CHF " << price << ps << endl;
    

        格式化文本进入缓冲区,在需要的情况下,该对象将使用动态内存分配来增大缓冲区。ostringstream类有一个名为str()的成员函数, 该函数返回一个被初始化被缓冲区的string对象

    string mesg = outstr.str(); // returns string with formatted information
    

    示例:

    #include <iostream>
    #include <sstream>
    #include <string>
    int main()
    {
        using namespace std;
        ostringstream outstr; // manages a string stream
    
        string hdisk;
        cout << "What's the name of your hard disk? ";
        getline(cin, hdisk);
        int cap;
        cout << "What's its capacity in GB? ";
        cin >> cap;
        // write formatted information to string stream
        outstr << "The hard disk " << hdisk << " has a capacity of "
                << cap << " gigabytes.\n";
        string result = outstr.str(); // save result
        cout << result;                  // show contents
        system("pause");
        return 0;
    }
    
  •       istringstream类允许使用istream方法族读取 istringstream 对象中的数据,istringstream 对象可以使用 string 对象进行初始化。

    假设facts是一个string对象,则要创建与该字符串相关联的istringstream对象,可以这样做:

    istringstream instr(facts); // use facts to initialize stream
    

    这样,便可以使用istream方法读取instr中的数据。例如,如果instr包含大量字符格式的整数,则可以这样读取它们:

    int n;
    int sum = 0;
    while (instr >> n)
        sum += n;
    

    用法示例:

    #include <iostream>
    #include <sstream>
    #include <string>
    int main()
    {
        using namespace std;
        string lit = "It was a dark and stormy day, and "
                     " the full moon glowed brilliantly. ";
        istringstream instr(lit); // use buf for input
        string word;
        while (instr >> word)      // read a word a time
            cout << word << endl;
        system("pause");
        return 0;
    
    }
    

5. read() 与 write() 边界处理

  • ifstream& read(char_type *__s, streamsize __n)
    basic_istream<_CharT, _Traits> &basic_istream::read(char_type *__s, streamsize __n) Extraction without delimiters.
    Parameters
    
    __s
    A character array.
    
    __n
    Maximum number of characters to store.
    
    Returns
    *this
    
    If the stream state is good(), 
    extracts characters and stores them into __s until one of the following happens: 
    - __n characters are stored 
    - the input sequence reaches end-of-file, in which case the error state is set to failbit|eofbit
    
    read() 如果实际读取的字符数不等于__n 返回 false 通常是因为读到了文件结尾那一段
    而字符串 get() 不会 上面讲过字符串 get() 的行为
  • 使用get() 配合string 读写文件 :
    SetConsoleOutputCP(65001);
    int bufvolum=512;
    ifstream fxml("C:\\Users\\34625\\Downloads\\cnblogs_blog_ComputerTech.20240111164025\\cnblogs.xml", ios_base::in); // create fis and associate with jamjar.txt
    if (!fxml.is_open())
    {
        cout << "\n open error!\n";
    }
    string buf;
    buf.reserve(bufvolum);
    buf.clear();
    int getCount{0};
    ofstream  fwrite("temp.xml");
    
    while (fxml.get(buf.data(), bufvolum+1, EOF))
    {
    
        int realget = fxml.gcount();
        if (realget + 1 != bufvolum)
        {
            cout << endl << endl << "----------------last write!------------------" << endl << endl;
            system("pause");
        }
        buf.append(buf.data());
    
        //        fwrite << buf;
        fwrite.write(buf.data(), realget);
        cout << buf.c_str();
    
        buf.clear();
        if (realget + 1 != bufvolum)
        {
            cout << endl << endl << "----------------last writed!------------------" << endl << endl;
            system("pause");
            break;
        }
    }
    fxml.close();
    fwrite.close();//及时关闭文件, 让读写顺利收尾 
    
  • 使用 read() 配合 string 读写文件 :
    SetConsoleOutputCP(65001);
    int bufvolum=512;
    ifstream fxml("C:\\Users\\34625\\Downloads\\cnblogs_blog_ComputerTech.20240111164025\\cnblogs.xml", ios_base::in); // create fis and associate with jamjar.txt
    if (!fxml.is_open())
    {
        cout << "\n open error!\n";
    }
    string buf;
    buf.reserve(bufvolum);
    buf.clear();
    int getCount{0};
    ofstream  fwrite("temp.xml");
    
    while (1)
    {
        fxml.read(buf.data(), bufvolum);
    
        int realget = fxml.gcount();
        if (realget != bufvolum)
        {
            cout << endl << endl << "----------------last write!------------------" << endl << endl;
            system("pause");
        }
        buf.append(buf.data());
    
        //        fwrite << buf;
        fwrite.write(buf.data(), realget);
        cout << buf.c_str();
    
        buf.clear();
        if (realget != bufvolum)
        {
            cout << endl << endl << "----------------last writed!------------------" << endl << endl;
            system("pause");
            break;
        }
    }
    fxml.close();
    fwrite.close();//及时关闭文件, 让读写顺利收尾 
    
  • 对于 write 来说实际写入的与你要求写入的数量不一致 肯定是发生了错误
    • 逻辑错误: 指定越界的字符数去写入, 非法读取越界的内存
    • 其他错误: 使用流状态确认函数fail() bad(), 打开异常开关 捕获异常并获取异常类的code()成员函数返回的系统错误代码 排查错误;

五.

  • C++17中新增了filesystem功能,使得跨平台文件系统 操作使用便方便简易
    简单示例:
    #include <filesystem>
    namespace fs = std::filesystem;
    if (fs::exists(folderPath) && fs::is_directory(folderPath))
    {
        std::cout << "文件夹存在" << std::endl;
    }
    else
    {
        std::cout << "文件夹不存在或者不是目录" << std::endl;
    }
    

C语言文件操作函数👈👈👈

To be continue…

C++—输入输出流和文件操作 输入输出流 阅读详情

相关推荐

c++读取文件操作【freop、fopen和文件输入输出流】

1、freopen重定向版 #include<cstdio> #include<iostream> using namespace std; //freopen重定向版,操作简单,有些时候不允许 //包含在头文件cstdio中 int main(){ int a; freopen("in.txt","r",stdin);//in.txt是文件名应该是跟程序文件在同一目录下 freopen("out.txt","w",stdout);//out.txt是自动生成的

qq_42397914的博客 1567

【C++】文件的输入与输出

C++文件的输入和输出

m0_67334604的博客 3746

C++ 文件输入输出

到目前为止,我们已经使用了标准库,它提供了和方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 和 。......

小天狼星_布莱克 的博客 4745

【C++篇】C++的输入和输出

知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的错误,同时方便本人的基础复习,也希望能帮助到大家最好的好人,都是犯过错误的过来人;一个人往往因为有一点小小的缺点,将来会变得更好。如有错漏之处,敬请指正,有更好的方法,也希望不吝提出。最好的生活方式就是和努力的大家,一起奔跑在路上。

陈七的博客,学习知识分享,期待与大家的交流 3万+

c++文件I/O

文件输入流 ifstream 文件输出流 ofstream 文件输入输出流 fstream 文件的打开方式 文件流的状态 文件流的定位:文件指针(输入指针、输出指针) 文本文件和二进制文件 1文件流类和文件流对象 输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。 和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各

希望我的博客,能帮上你解决学习中工作中所遇到的问题 862

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

【C++入门】C++ 输入输出和文件操作

C++输入输出和文件操作 主要内容: 一、输入输出包括:输入输出相关的类、流操纵算子; 二、文件读写包括:创建文件、读写文件(二进制文件、文本文件)关闭文件.

PKM of bk 9099

【Origin+Python】使用External Python批量出图代码参考2

不使用part2 的代码,自己打开一个origin2022的界面。这里主要介绍一些进阶代码以及使用盗版origin要如何。3 批量绘制相同设置的曲线图。然后就是没有水印的图片了。

zeng001201的博客 1908

C++ 输入输出和文件流详解

C++中的输入输出流是处理标准输入输出的重要工具。cin用于标准输入,通常与>>运算符配合使用,支持缓冲输入和类型安全,但需注意输入失败和混合输入时的处理。cout用于标准输出,与<<运算符结合,支持链式输出和自动类型转换,常用控制符包括endl和setw。cerr和clog分别用于无缓冲和有缓冲的错误输出,前者适合紧急错误,后者用于常规日志。操纵符如setw、setprecision等可用于格式化输出,而setf和unsetf则用于自定义格式设置。这些工具为C++程序提供了灵活且强

weixin_43484713的博客 1239

Notion访问卡顿?一键优化DNS与Hosts提升加载速度

本文针对Notion访问卡顿问题,提供了两种核心优化方案:修改Hosts文件与配置DNS。详细解析了卡顿根源在于网络链路,并手把手指导用户在Windows、Mac、iOS及Android设备上实施优化,旨在通过替换为更优线路,显著提升Notion的页面加载与同步速度。

fff88的博客 1195

GEOS-Chem笔记——模式下载安装+驱动数据+运行流程

看过我博客的会发现我写了很多CESM的笔记,但是说实话,平时科研我其实更多时候是GEOS-Chemuser。之所以写了很多CESM笔记,其实是因为不会,就边学边写。然后GEOS-Chem已经用比较熟了,所以也没想过做笔记啥的。但是我发现越来越多朋友私信我各种CESM问题,我觉得我可能给大家营造了一种我是CESM达人的错觉。感觉自己有点跑偏了呢。公平起见,我觉得我有必要补充点GEOS-Chem笔记。 GEOS-Chem是研究大气化学的人常用的大气化学传输模式,在全世界范围的大气化学研究组中被广泛使用。不过.

砍柴姑娘Jourosy的博客 1万+

c++输入输出流和文件操作总结

格式类似的,还有cin.get(arr,20),不同的是geline读取并丢弃换行符,而cin.get仅将其留在输入队列中。同样cin也会将回车键生成的换行符留下。一般后面再要输入时,得加一个无参数的cin.get(),读取下一个符号即处理留下的换行符。cin.getline(arr,20),同样可读取空格,在读取完指定数目字符后或者遇到换行符时,停止读取。如例参数为20,则至多读取19个字符,余下空间存储自动添加在结尾的\0。c++的输入输出流,指的是字节流的数据传送。

Lyricrain的博客 3275

Python 爬虫实战:爬取微博热搜与用户评论数据

本文系统讲解微博热搜榜单与用户评论数据的爬取技术方案。针对微博热搜榜采用Requests+BeautifulSoup解析静态HTML结构,实现高效爬取;对于动态加载的评论数据,使用Selenium模拟浏览器行为规避反爬机制。详细阐述技术选型、反爬策略、数据清洗及存储方法,提供完整代码实现和输出示例。同时强调合规要求,提示开发者需在遵守平台规则的前提下进行数据采集。该方案为舆情分析和热点研究提供了可落地的技术实现路径。

2503_91057718的博客 1712

【C++】<知识点> 标准和文件的输入输出

C++中标准和文件输入输出的知识

致力于Linux的博客 933

【案例讲解】LVGL关于旋转的配置

在实现项目中,因为横竖屏的关系,需要对其做90度的旋转。配置旋转时发现一些局部刷新控件,旋转后效果不对。异常图标正常图标。

Bigan(安)的博客 4282

腾讯Android开发面试准备指南及参考答案

腾讯元宝高级Android开发职位面试准备指南 该职位要求扎实的Kotlin基础、架构设计能力和性能优化经验,重点关注Android客户端开发。面试流程约3轮,支持线上面试,流程较快。候选人需准备以下核心内容: 基础技术:Kotlin特性、Android开发生命周期、多线程编程 架构设计:MVVM/MVI模式应用、组件化解耦方案 性能优化:流畅度提升、内存管理、启动时间优化等实战案例 加分技能:Jetpack Compose开发、音视频处理、跨平台开发经验 建议结合项目经验准备具体案例,突出技术深度和问题解

郑伟强dev的专栏 1193

C和C++基本文件输入输出

C C语言中freopen()函数是用来重新定向的,所谓重新定向是给输入和输出的位置重新定向。原本输入位置是键盘缓存区,输出在屏幕上,用了重新定向后可以将输入位置改变成一个文件,而输出位置也可以输出到一个文件中,具体代码可以这么写: freopen ("text.txt","r",stdin); freopen ("text1.txt","w",stdout); 这里输入和输出便都在文件中操作了。可是这样做有一个弊端,就是所有输入输出都将在文件中操作,如何灵活控制呢?这就要用到fopen()函数了,可以

tianyunlinger的博客 211

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2246

C++ 输入输出流之文件操作和文件流

1. 根据文件中数据的组织形式,文件分为: ASCII文件(文本文件或者字符文件):它的每个字节存放一个ASCII代码,代表一个字符(一一对应),易于阅读,方便显示和打印。 例如:43,00000100 00000011 二进制文件(内部格式文件或字符文件):是把内存中的数据按照其在存储中的形式原样输出到磁盘上存放,节省空间,输入输出快,效率高。 例如:43,001

学习,记录,总结 的专栏 4094

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++基础知识整理十五(流和类的概述 输入输出成员函数 文件)

1,流和类的概述 2,输入输出成员函数 3,打开顺序文件 4,文件的读写和关闭 5,随机文件操作 一 seekTest.cpp代码如下: #include "pch.h" #include <iostream> #include <fstream> using namespace std; int main(in...

一行一生 524

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++ 输入输出和文件的几种方法

c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法c++ 输入输出和文件的几种方法 ...

windyuan~ 307

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++学习(十)输入输出和文件

1 流的控制&&流的继承 1.1 流控制 类名 在哪个头文件中声明 ios iostream istream,ostream,iostream iostream ifstream,ofstream,fstram fstream istrstream,ostrstream,strstream strstream 格式化I/O iomanip 1.2...

ShengjiangWu-sharing 305

C++ (六) 输入输出和文件操作:C++的魔法书卷

输入输出和文件操作是C++中用于信息交换的基本工具。通过标准输入输出流,你可以与用户进行交互;通过文件流,你可以在程序和永久存储之间传递信息。这些工具就像是魔法书卷,记录着知识的流动和保存。现在,拿起你的魔杖(键盘),继续在C++的魔法世界中书写和阅读吧!愿你的信息流动如同魔法一般流畅,愿你在编程的征途上充满交流和记录!

weixin_39346529的博客 904

cin需要什么头文件_C++输入输出(cin和cout)

在C语言中,我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库。【例1】简单的输入输出代码示例:#includeusing namespace std;int main(){ int x; float y; cout<>x; cout<>y; ...

weixin_28684655的博客 5144

C++证道之路第十七章输入输出和文件

太太太无聊了,我后面会重写的!!!!!!

weixin_46032775的博客 1436
上一篇: C++ Template
下一篇: HTML之元素相对页面(视口)左上角的坐标
Computer_Tech
博客等级 码龄3年 573粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值