• C++的流和文件介绍


    C++的流和文件介绍

    C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。
    学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案:
    使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据;
    使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。
    C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++又独立开发了一套全新的 I/O 解决方案,其中就包含常用的 cin 和 cout。

    数据的输入和输出(input/output简写为I/O),数据输入输出的过程,可以形象地看成流。

    在C++中,iostream头文件,iostream 是 Input Output Stream 的缩写,意思是“输入输出流”,提供了 cin对象(一般情况下代表显示器) 和 cout对象(一般情况下代表显示器),分别用于从标准输入读取流 和 向标准输出写入流。

    使用 cout 进行输出时需要紧接着使用“<<”操作符——插入符(inserter),使用 cin 进行输入时需要紧接着使用“>>”操作符——提取符(extractor)。

    在编写 C++ 程序时,如果需要使用输入输出时,则需要包含头文件iostream,它包含了用于输入输出的对象,cout 和 cin 都是 C++ 的内置对象,而不是关键字。C++ 库定义了大量的类(Class),程序员可以使用它们来创建对象,cout 和 cin 就分别是 ostream 和 istream 类的对象,只不过它们是由标准库的开发者提前创建好的,可以直接拿来使用。这种在 C++ 中提前创建好的对象称为内置对象。

    使用 cout 进行输出时需要紧跟<<运算符,使用 cin 进行输入时需要紧跟>>运算符,这两个运算符可以自行分析所处理的数据类型,因此无需像使用 scanf 和 printf 那样给出格式控制字符串。

    C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为“流”,实现此过程的类称为“流类”。下图展示了 C++ 中用于实现数据输入和输出的流类及它们之间的关系:

    C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为“流”,实现此过程的类称为“流类”。下图展示了 C++ 中用于实现数据输入和输出的流类及它们之间的关系:

    【来自 https://cplusplus.com/reference/】

    cin 就是 istream 类的对象,cout 是 ostream 类的对象,它们都声明在 头文件中,这也解释了“为什么在 C++ 程序中引入 就可以使用 cin 和 cout”。

    C++ cin 输入流对象常用成员方法

    成员方法名

    功能

    getline(str,n,ch)

    从输入流中接收 n-1 个字符给 str 变量,当遇到指定 ch 字符时会停止读取,默认情况下 ch 为 '\0'。

    get()

    从输入流中读取一个字符,同时该字符会从输入流中消失。

    gcount() 

    返回上次从输入流提取出的字符个数,该函数常和 get()、getline()、ignore()、peek()、read()、readsome()、putback() 和 unget() 联用。

    peek()

    返回输入流中的第一个字符,但并不是提取该字符。

    putback(c) 

    将字符 c 置入输入流(缓冲区)。

    ignore(n,ch)

    从输入流中逐个提取字符,但提取出的字符被忽略,不被使用,直至提取出 n 个字符,或者当前读取的字符为 ch。

    operator>>

    重载 >> 运算符,用于读取指定类型的数据,并返回输入流对象本身。

    C++ cout 输出流对象常用成员方法

    成员方法名

    功能

    put()

    输出单个字符。

    write()

    输出指定的字符串。

    tellp()

    用于获取当前输出流指针的位置。

    seekp()

    设置输出流指针的位置。

    flush()

    刷新输出流缓冲区。

    operator<<

    重载 << 运算符,使其用于输出其后指定类型的数据。

    这里给出一个举例

    1. //C++输入流和输出标准流示例
    2. #include
    3. using namespace std;
    4. int main() {
    5. char str[30] = {0};
    6. cout << "请输入一个字符串:" ;
    7. //读取一行字符串
    8. cin.getline(str, 30);
    9. //输出上一条语句读取字符串的个数
    10. cout << "读取了 "<gcount()<<" 个字符" << endl;
    11. //输出数组存储的字符串
    12. cout.write(str, 30);
    13. return 0;
    14. }

    程序运行效果如下:

    文件

    电脑中的文件,也可以称之为计算机文件,是存储在某种长期储存设备或临时存储设备中的一段数据流,并且归属于计算机文件系统管理之下。所谓长期储存设备一般指磁盘、光盘、磁带等。而短期存储设备一般指计算机内存。需要注意的是,存储于长期存储设备的文件不一定是长期存储的,有些也可能是程序或系统运行中产生的临时数据,并于程序或系统退出后删除。

    根据文件中数据的组织方式,或从编程语言读写处理操作角度,分为两种:

    文本文件

    二进制文件

    计算机的存储本质上是二进制的,这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思。广义上的二进制文件包括文本文件。

    顺便提示:Windows的“记事本”可以打开文本文件显示正常,打开二进制文件因为不能解析其编码出现乱码。

    fstream 类拥有 ifstream 和 ofstream 类中所有的成员方法,下表列举的了部分常用的成员方法:

    成员方法名

    适用类对象

    功   

    open()

    fstream
    ifstream
    ofstream

    打开指定文件,使其与文件流对象相关联。

    is_open()

    检查指定文件是否已打开。

    close()

    关闭文件,切断和文件流对象的关联。

    swap()

    交换 2 个文件流对象。

    operator>>

    fstream
    ifstream

    重载 >> 运算符,用于从指定文件中读取数据。

    gcount()

    返回上次从文件流提取出的字符个数。该函数常和 get()、getline()、ignore()、peek()、read()、readsome()、putback() 和 unget() 联用。

    get()

    从文件流中读取一个字符,同时该字符会从输入流中消失。

    getline(str,n,ch)

    从文件流中接收 n-1 个字符给 str 变量,当遇到指定 ch 字符时会停止读取,默认情况下 ch 为 '\0'。

    ignore(n,ch)

    从文件流中逐个提取字符,但提取出的字符被忽略,不被使用,直至提取出 n 个字符,或者当前读取的字符为 ch。

    peek()

    返回文件流中的第一个字符,但并不是提取该字符。

    putback(c)

    将字符 c 置入文件流(缓冲区)。

    operator<<

    fstream
    ofstream

    重载 << 运算符,用于向文件中写入指定数据。

    put()

    向指定文件流中写入单个字符。

    write()

    向指定文件中写入字符串。

    tellp()

    用于获取当前文件输出流指针的位置。

    seekp()

    设置输出文件输出流指针的位置。

    flush()

    刷新文件输出流缓冲区。

    good()

    fstream
    ofstream
    ifstream

    操作成功,没有发生任何错误。

    eof()

    到达输入末尾或文件尾。

    文件打开成员方法:open("文件名",打开方式);

    打开方式(open mode)

    作用解释

    ios::in

    为输入(读)而打开文件

    ios::out

    为输出(写)而打开文件

    ios::binary

    二进制方式打开,用于二进制文件

    ios::ate

    初始位置:文件尾

    ios::app  

    附加在文件末尾

    ios::trunc        

    如果文件存在先删除,再创建

    ios::nocreate

    不建立文件,所以文件不存在时打开失败

    ios::noreplace

    不替换文件,所以打开文件时如果文件存在失败

    提示:文件打开方式可以多个组合使用,利用 | 操作符。如:用二进制方式写文件 ios::binary | ios:: out

    这里给出一个举例:

    1. // C++文件流类成员方法用法示例
    2. #include
    3. #include
    4. using namespace std;
    5. int main() {
    6.     const char *str ="我的文字abc";
    7.     //创建一个 fstream 类对象
    8.     fstream fs;
    9.     //将test.txt 文件和 fs 文件流关联
    10.     fs.open("D:\\test.txt", ios::out);
    11.     //向test.txt文件中写入 str 字符串
    12.     fs<
    13.     fs.close();
    14.     return 0;
    15. }

    编译运行之,将产生文本文件D:\\test.txt

    C++文件读写操作实例  待续

    C++权威资源

    C语言|C++中文网

    cppreference.com

    cplusplus.com - The C++ Resources Network

    https://c-cpp.com/

    https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5

    https://cplusplus.com/

  • 相关阅读:
    极狐GitLab专家团队支招解决 CVE-2023-4998 漏洞问题
    C++异常及异常优缺点
    spring framework notes
    差分数组leetcode 2770 数组的最大美丽值
    学生党蓝牙耳机性价比排行榜,好评榜TOP5机型推荐
    HTML静态网页作业——基于html+css+javascript+jquery+bootstarp响应式成都家乡介绍网页
    自动售卖团餐:借助智享直播AI实景无人直播系统,团餐自动售卖,无需人工参与,省时高效。
    Docker 搭建Redis Cluster 集群
    8、Yaml读取单一属性数据(配置文件是有xml,yaml,properties这三种。只是yaml后缀可以用.yml)
    绿色计算产业发展白皮书:2022年OceanBase助力蚂蚁集团减排4392tCO2e
  • 原文地址:https://blog.csdn.net/cnds123/article/details/125786435