首页 > 编程语言 >C++输入输出流

C++输入输出流

时间:2024-07-27 19:24:33浏览次数:16  
标签:输出 cout 字符 输入输出 C++ ostream 缓冲区

目录

入门       

 C++ cout.put():输出单个字符

C++ cout.write():输出字符串

C++ cout.tellp()和cout.seekp()方法详解 

C++ tellp()成员方法

C++ seekp()成员方法

 C++ cout格式化输出(超级详细)

C++ cout成员方法格式化输出

使用流操纵算子格式化输出

C++怎样对输入输出重定向?(3种方法)

C++ freopen()函数实现重定向

C++ rdbuf()函数实现重定向

C++通过控制台实现重定向

C++如何管理输出缓冲区?

刷新输出缓冲区

unitbuf 操作符

关联输入和输出流

cin.get():C++读取单个字符

cin.getline():C++读入一行字符串(整行数据)

C++如何跳过(忽略)指定字符?

C++怎样查看输入流中的下一个字符?

C++ cin是如何判断输入结束(读取结束)的?

cin 判断控制台(键盘)读取结束


入门       

 cin 就是 istream 类的对象,cout 是 ostream 类的对象,它们都声明在 <iostream> 头文件中,这也解释了“为什么在 C++ 程序中引入 <iostream> 就可以使用 cin 和 cout”(当然使用 cin 和 cout,还需要声明 std 命名空间)。

        除此之外,<iostream> 头文件中还声明有 2 个 ostream 类对象,分别为 cerr 和 clog。它们的用法和 cout 完全一样,但 cerr 常用来输出警告和错误信息给程序的使用者,clog 常用来输出程序执行过程中的日志信息(此部分信息只有程序开发者看得到,不需要对普通用户公开)。

cout、cerr 和 clog 之间的区别如下:

  1. cout 除了可以将数据输出到屏幕上,通过重定向(后续会讲),还可以实现将数据输出到指定文件中;而 cerr 和 clog 都不支持重定向,它们只能将数据输出到屏幕上;
  2. cout 和 clog 都设有缓冲区,即它们在输出数据时,会先将要数据放到缓冲区,等缓冲区满或者手动换行(使用换行符 '\n' 或者 endl)时,才会将数据全部显示到屏幕上;而 cerr 则不设缓冲区,它会直接将数据输出到屏幕上。


除了以上 2 点特性上的不同之外,cerr、clog 和 cout 没有任何不同。之所以我们常用 cout,是因为 cerr 和 clog 有各自不同的适用场景。以 cerr 为例,一旦程序某处使用 cerr 输出数据,我们自然而然地会认为此处输出的是警告或者错误信息。

  • istream:常用于接收从键盘输入的数据;
  • ostream:常用于将数据输出到屏幕上;
  • ifstream:用于读取文件中的数据;
  • ofstream:用于向文件中写入数据;
  • iostream:继承自 istream 和 ostream 类,因为该类的功能兼两者于一身,既能用于输入,也能用于输出;
  • fstream:兼 ifstream 和 ofstream 类功能于一身,既能读取文件中的数据,又能向文件中写入数据。

 

例子:

#include <iostream>
using namespace std;
int main() {
    char url[30] = {0};
    //读取一行字符串
    cin.getline(url, 30);
    //输出上一条语句读取字符串的个数
    cout << "读取了 "<<cin.gcount()<<" 个字符" << endl;
    //输出 url 数组存储的字符串
    cout.write(url, 30);
    return 0;
}

 程序执行结果为:

http://c.biancheng.net
读取了 23 个字符
http://c.biancheng.net

 C++ cout.put():输出单个字符

put() 方法专用于向输出流缓冲区中添加单个字符,其语法格式如下:

ostream&put(char c);

其中,参数 c 为要输出的字符。

可以看到,该函数会返回一个 ostream 类的引用对象,可以理解返回的是 cout 的引用。

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str = "ten.gnehcnaib.c//:ptth";
    for (int i = str.length() - 1; i >= 0; i--) {
        cout.put(str[i]);  //从最后一个字符开始输出
    }
    cout.put('\n');
    return 0;
}

运行结果:

http://c.biancheng.net

除了使用 cout.put() 函数输出一个字符外,还可以用 putchar() 函数输出一个字符。putchar() 函数是C语言中使用的,在 <stdio.h> 头文件中定义,C++保留了这个函数,在 <iostream> 头文件中定义。 

C++ cout.write():输出字符串

write() 成员方法专用于向输出流缓冲区中添加指定的字符串,初学者可以简单的理解为输出指定的字符串。其语法格式如下:

ostream&write(const char * s,streamsize n);

其中,s 用于指定某个长度至少为 n 的字符数组或字符串;n 表示要输出的前 n 个字符。

可以看到,该函数会返回一个 ostream 类的引用对象,可以理解返回的是 cout 的引用。 

#include <iostream>
using namespace std;
int main() {
    cout.write("http://", 7).write("c.biancheng.net", 15).write("/cplus/", 7);
    return 0;
}

 程序执行结果为:

http://c.biancheng.net/cplus/

C++ cout.tellp()和cout.seekp()方法详解 

        无论是使用 cout 输出普通数据,用 cout.put() 输出指定字符,还是用 cout.write() 输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。

        值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream 类中提供有 tellp() 和 seekp() 成员方法,借助它们就可以修改位于输出流缓冲区中的数据。

C++ tellp()成员方法

        tellp() 成员方法用于获取当前输出流缓冲区中最后一个字符所在的位置,其语法格式如下:

streampos tellp();

        tellp() 不需要传递任何参数,会返回一个 streampos 类型值。事实上,streampos 是 fpos 类型的别名,而 fpos 通过自动类型转换,可以直接赋值给一个整形变量(即 short、int 和 long)。也就是说,在使用此函数时,我们可以用一个整形变量来接收该函数的返回值。 

#include <iostream> //cin 和 cout
#include <fstream> //文件输入输出流
int main() {
    //定义一个文件输出流对象
    std::ofstream outfile;
    //打开 test.txt,等待接收数据
    outfile.open("test.txt");
    const char * str = "http://c.biancheng.net/cplus/";
    //将 str 字符串中的字符逐个输出到 test.txt 文件中,每个字符都会暂时存在输出流缓冲区中
    for (int i = 0; i < strlen(str); i++) {
        outfile.put(str[i]);
        //获取当前输出流
        long pos = outfile.tellp();
        std::cout << pos << std::endl;
    }
    //关闭文件之前,刷新 outfile 输出流缓冲区,使所有字符由缓冲区流入test.txt文件
    outfile.close();
    return 0;
}

输出结果为 1~29。

这意味着,程序中每次向输出流缓冲区中放入字符时,pos 都表示的是当前字符的位置。比如,当将 str 全部放入缓冲区中时,pos 值为 29,表示的是最后一个字符 '/' 位于第 29 个位置处。

C++ seekp()成员方法

seekp() 方法用于指定下一个进入输出缓冲区的字符所在的位置

seekp() 方法有如下 2 种语法格式:

//指定下一个字符存储的位置
ostream& seekp (streampos pos);
//通过偏移量间接指定下一个字符的存储位置   
ostream& seekp (streamoff off, ios_base::seekdir way);
其中,各个参数的含义如下:
  • pos:用于接收一个正整数࿱

标签:输出,cout,字符,输入输出,C++,ostream,缓冲区
From: https://blog.csdn.net/ershiyidian/article/details/140626607

相关文章

  • C++ 红黑树
    1. 红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质......
  • c++ typedef 关键字详解
    在C++中,typedef关键字用于为已有的数据类型创建一个新的别名。这使得代码更加易读和维护,尤其是当使用复杂的类型定义时。typedef可以用来简化代码或使其更具描述性。基本语法typedefexisting_typenew_name;这里,existing_type是已有的类型,new_name是你为它创建......
  • 计组笔记第七章——输入输出系统
    7.1.1I/O系统和IO控制方式常见I/O设备:鼠标、键盘;显示器、打印机;硬盘、光盘。主机如何与I/0设备进行交互?I/O接口:又称I/O控制器、设备控制器,负责协调主机与外部设备之间的数据传输。I/O接口与CPU之间靠总线连接,与外设之间靠USB连接线连接。I/O接口多种多样,也会指定相应的标......
  • 【操作系统/C++ malloc 1KB和1MB 有什么区别?brk | mmap】
    关于malloc如何根据请求的内存大小选择使用brk还是mmap的机制,是glibc(GNUCLibrary)中malloc实现的一个常见策略,尽管具体的阈值(如128KB)可能会因glibc的不同版本或配置而有所不同。brkbrk是一个系统调用,用于改变数据段的结束地址(即“程序断点”)。在UNIX和类U......
  • 【C++深度探索】AVL树与红黑树的原理与特性
    ......
  • 计算机组成原理基础第7讲 输入输出系统
    计算机组成原理基础第7讲输入输出系统2.输入输出系统的组成考点二:I/O接口接口的功能和组成I/O接口的基本组成3.接口类型4.程序查询方式考点三:中断系统......
  • C++多线程基本使用方式
    一、线程创建        创建线程的函数  thread t(函数名f,函数f的参数) 或者 用lambda表达式代码:#include<iostream>#include<thread>#include<vector>usingnamespacestd;voidoutput(stringinput,inta){ cout<<input<<endl; cout<<a......
  • Dynamsoft Barcode Reader SDK C++ 10.4.10 Crack-24.7.22
    DynamsoftBarcodeReaderDocumentationforC++EditionDynamsoftBarcodeReader(DBR)SDKC++EditionisabarcodereadingtooldesignedspecificallyforC++developers.LeveragingtheefficiencyandflexibilityoftheC++language,DBRC++Editionprovid......
  • 【C++初阶】vector
    【C++初阶】vector......
  • C语言day04(输入输出、垃圾字符、分支语句)
    C语言day04【1】按照字符输入输出1》输出:putchar定义格式:intputchar(intc);功能:按照字符输出,向终端输出一个字符参数:要输出的字符的ascii值、字符返回值:输出字符的ASCII值2》输入:getchar定义格式:intgetchar(void)功能:按照字符输入,从终端输入一个字符参数:无......