东南计算机复试 C++大学教程(第十三章 输入输出流)

char* 变量的输出

如果我们直接输出char* 变量 如下所示

int main()
{
    char a = '?';
    char* b = &a;
    char* c = new char[10]{ "dawhi" };
    cout << b << endl;
    cout << c << endl;
}

我们所输出的并不是一个地址 而是其指向的实际内容
那么如何输出地址呢?

using namespace std;
int main()
{
    char a = '?';
    char* b = &a;
    char* c = new char[10]{ "dawhi" };
    void* d = b;
    void* e = c;
    char* f = reinterpret_cast<char*>(e);
    cout <<hex<< b << endl;
    cout <<hex<< c << endl;
    cout <<hex<< d << endl;
    cout <<hex<< e << endl;
    cout <<hex<< f << endl;
}
put函数
cout.put(65);

输出对象为A

输入流

输入流cin 流提取运算符 >> 默认跳过输入流中的空白字符

get

get函数使用示例:(get函数可以读取空格)

int main()
{
    char a;
    while ((a = cin.get()) != EOF)
    {
        cout << a;
    }
}
int main()
{
    //char a;
    char a[40];
    cin.get(a, 30, '\n'); //此处可以设置截断符号 且截断符号不会被读入
    cout << a << endl;
}

要注意的是 上述操作截断符号不会被读入字符输出而是保留在输入流之内
如果要清除输入流内内容 可采用cin.ignore() 的方式

getline

getline和get最大的区别在于getline丢弃分隔符 而不是保留在输入流之中

int main()
{
    char b;
    char a[40];
    cin.getline(a, 30, '\n');
    cout << a << endl;
    b = cin.get();
    cout << b << endl;
}

上述程序如果是get函数 那么输入一行字符后程序会自动结束 而getline不会 因为输入流中的换行已经被丢弃 程序等待用户为b输入字符

使用read write 和 gcount

read write是非格式化的输入输出
示例:

using namespace std;
int main()
{
    char a[50];
    cin.read(a, 40);
    cout.write(a, cin.gcount());
    
}

这里关于gcount我有一点想要补充
如果使用getline读入字符 getline会自动补充换行符 如果输入流字符数量大于读入的字符数量 那么gcount不会对自动补充的换行符进行+1操作
如果输入流字符数量小于等于读入的字符数量 则会+1

不理解也可以 我猜不考

int main()
{
        char a[10];
        cin.getline(a, 10); //输入"1234067890"
        cout << a << endl; //输出"123456789"
        cout << cin.gcount(); //输出9
        cin.getline(a, 10); //输入"1234067890"
        cout << cin.gcount(); //输出9
}
流操作符

流操作符 hex oct dec 以及setbase函数设置的进制都是粘性的
也就是设置一次之后你不改回来就会一直保持该进制输出

precision设置方法同样有两种
如下所是:

int main()
{
    double a = 100;
    double b = 100;
    cout <<fixed<< setprecision(6) << a << endl;
    cout.precision(5);
    cout <<fixed<< a << endl;
}

同时可借助

    int d = cout.precision();
    cout << d << endl;

来获取原来的/现在的设置

宽度: width 和setw 要注意这两个不是黏性设置

自定义输出流操作符

using namespace std;
ostream& nmhl(ostream& c)
{
    c << "nmsl" << endl;
    return c;
}
int main()
{
    cout << nmhl << endl;
}
showpoint

流操作符 showpoint
强制要求浮点数输出小数点和尾数0 且精度设置为6
此处的精度并非指的时小数点后位数 而是包括整数部分

当我们不使用fixed和scientific运算符号时 我们设置setprecision只能设置显示的有效位数而不是小数点的有效位数

int main()
{
    double a = 54.01200;
    cout << a << endl;
    cout << showpoint << a << endl;
    cout << showpoint << setprecision(10) << a << endl;
    cout << fixed << a << endl;
}

测试结果


image.png
showpos internal left right showbase

没什么好讲的 showpos显示符号 internal会将符号左对齐 数字右对齐
显示八进制 十六进制基数

uppercase

大写 小写控制 可以在输出十六进制整数和科学计数法的时候强制X E为大写

boolalpha

强制bool型变量按照 true false格式输出

通过成员函数flags设置和重制格式状态

通过ios_base fmtflags A=cout.flags();来获取当前flag状态

测 试 题

通过flags函数可以设置和重置输出格式状态
头文件<iostream>包含了所需要的I/O操作符
使用参数化的流操作符 必须包括<iomanip>

流插入运算符 <<
流提取运算符 >>

系统支持的四个标准设备对象是 cout cin cerr clog
showpos要求显示加号
cerr的输出是无缓冲的 clog的输出是有缓冲的

uppercase

cout<<""dawhdiwa""<<endl 该语句无法正常执行 必须使用转义字符‘\’

最近确实很怠惰 也不怎么想学了 唉

13.14 流提取运算符

为了给大伙演示一下这玩意是怎么用的 我这里仅仅做示范

#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
using namespace std;
class A
{
    friend istream& operator >>(istream& cin, A& ac);
public:
    string num1;
    string num2;
    string num3;
    void cou()
    {
        cout << num1 << endl;
        cout << num2 << endl;
        cout << num3 << endl;
    }
};
istream& operator >>(istream& cin, A& ac)
{
    char a[14];
    cin.getline(a, 14);
    if (cin.gcount() != 14)
    {
        cout << '1' << endl;
        cin.clear(ios::failbit);
    }
    if (a[1] == '0' || a[1] == '1')
    {
        cout << '2' << endl;
        cin.clear(ios::failbit);
    }
    if (a[2] != '1' && a[2] != '0')
    {
        cout << '3' << endl;
        cin.clear(ios::failbit);
    }
    if (cin.fail() != 1)
    {
        string num = a;
        ac.num1 = num.substr(1, 3);
        ac.num2 = num.substr(5, 3);
        ac.num3 = num.substr(9, 4);
        return cin;
    }
    else {
        cout << "输入数据存在问题";
        cout << "程序结束";
        return cin;
    }
}
int main()
{
    A as;
    if ((cin >> as).fail())
    {
        return 0;
    }
    else
    {
        as.cou();
    }
}

因为我前面已经提到过getline读入字符大于指定字符数量时 计数比原来少1的事情
当然你觉得太玄学 你也可以使用getline(cin,a) (a设置为string) 然后判断a的长度

13.17 打印Ascil列表
int main()
{
    for (int i = 33; i < 126; i++)
    {
        char a=i;
        cout<<right <<setw(4) <<a << dec << setw(4) << i << oct << setw(4) << i << setw(4) << hex << i << endl;
    }
}

下 ~ 一 ~ 章 ~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 浅谈C++常用输入输出 在编写C++程序的时候,经常因为输入输出头疼,所以在这里做一个小结,记录一下常用的输入输出...
    MinoyJet阅读 9,148评论 0 6
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 5,683评论 0 6
  • I/O流的概念 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。 C++输...
    青春猪头少年_阅读 3,607评论 0 0
  • 清晨伴着阳光,阳光很灿烂,走在阳光下仰着头享受美好,一个有着漂亮柔顺黑发的女子穿着一件白色连衣裙静静的走在小镇...
    愤怒的丶小裸裸阅读 1,747评论 0 0
  • 《相信相信的力量》 不是从孩子身上看到了希望 你才相信孩子 而是你相信了孩子 你才能有希望 不是孩子有了责任 你才...
    花开有晟阅读 1,103评论 0 0

友情链接更多精彩内容