首页 > 其他分享 >IO类

IO类

时间:2024-05-25 14:44:07浏览次数:12  
标签:std 文件 file fstream fstrm IO 缓冲区

一、IO类

c++不直接处理输入和输出,而是通过标准库中的类型处理IO。C++ 的 I/O(输入/输出)库主要包含在 < iostream >、< fstream >、< sstream > 等头文件中。这些库提供了丰富的功能,用于在控制台、文件、字符串等之间进行数据的输入和输出。

  • iostream头文件
类型 作用
istream(宽字符为wistream) 从流读取数据
ostream (宽字符为wostream) 向流写入数据
iostream(宽字符为wiostream) 读写流
  • fstream头文件
类型 作用
ifstream(宽字符版本wifstream) 从文件读取数据。
ofstream (宽字符版本wofstream) 向文件写入数据
fstream(宽字符版本wfstream) 读写文件
  • sstream头文件
类型 作用
istringstream(宽字符版本wistringstream) 从string读取数据
ostringstream (宽字符版本wostringstream) 向string写入数据
stringstream(宽字符版本wstringstream) 读写string

1、IO对象无拷贝和赋值

C++ 的 I/O 对象(如 std::cin、std::cout、文件流对象等)通常不支持拷贝构造函数和拷贝赋值操作符,这是因为这些对象通常代表与特定资源(如控制台、文件等)的关联,而这些资源通常不能简单地被复制。

ofstream out1, out2;
out1 = out2;        
//错误:IO类不能进行赋值操作

ofstream print(ofstream);   
//错误:I/O流对象不应该被复制或返回,可能会导致资源泄露。

out2 = print(out2)  
//错误:不能拷贝流对象

如果你想在多个地方使用相同的 I/O 功能,你通常应该传递对 I/O 对象的引用,而不是试图复制它们。

void processFile(std::ifstream& file)
{  
    std::string line;  
    while (std::getline(file, line)) 
    {  
        // 处理每一行  
        std::cout << line << std::endl;  
    }  
}  

2、条件状态

在C++中,I/O流类(如istream、ostream、fstream、ifstream、ofstream等)都包含条件状态,用于表示流的状态。

这些状态指示了流的当前情况,例如是否遇到了输入/输出错误、是否到达文件末尾(EOF)等。

方法 作用
strm::iostat 是一种类型,提供了表达条件状态的完整功能
strm::badbit 用来指出流已经崩溃
strm::failbi 用来指出一个IO操作失败
strm::eofbit 用来指出流到达了文件结束
strm::goodbi 用来指出流未处于错误状态,此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit置位,则返回`true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态(即没有failbit、badbit或eofbit置位),则返回true
s.clear() 将流s中所有条件状态位复位,将流s的状态设置成有效,返回void
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags类型为strm::iostate。返回void
s.setstate(flags) 根据给定的标志位flags,将流s中对应的条件状态位置位,表示发生了错误。flags类型为strm::iostate。返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate

3、查询和管理流的状态

#include <iostream>  
#include <fstream>  
  
int main() {  
    // 尝试打开一个不存在的文件  
    std::ifstream file("a.txt");  
  
    // 尝试从文件中读取一行  
    std::string line;  
    std::getline(file, line);  
  
    // 检查流的状态  
    std::cout << std::boolalpha; // 设置为输出bool值为true/false而非1/0  
  
    // 检查是否到达文件末尾(EOF)  
    std::cout << "EOF detected: " << (file.eof() ? "true" : "false") << std::endl;  
    // 注意:如果文件不存在,eof()可能不会被置位,直到尝试读取并失败  
  
    // 检查是否发生I/O操作失败  
    std::cout << "Failbit set: " << (file.fail() ? "true" : "false") << std::endl;  
    // 当文件不存在或无法读取时,failbit通常会被置位  
  
    // 检查流是否崩溃(如磁盘错误)  
    std::cout << "Badbit set: " << (file.bad() ? "true" : "false") << std::endl;  
    // 在这个例子中,badbit通常不会被置位,除非发生严重的I/O错误  
  
    // 检查流是否处于良好状态  
    std::cout << "Goodbit set: " << (file.good() ? "true" : "false") << std::endl;  
    // 如果failbit、badbit或eofbit中的任何一个被置位,good()将返回false  
  
    // 检查流的当前状态(返回一个包含所有置位标志的iostate值)  
    std::iostate state = file.rdstate();  
    std::cout << "Current state: " << state << std::endl; // 这里可能会输出一些数字,代表状态位的组合  
  
    // 重置流的状态  
    file.clear(); // 清除所有状态标志  
  
    // 再次检查流是否处于良好状态  
    std::cout << "After clear, Goodbit set: " << (file.good() ? "true" : "false") << std::endl;  
  
    // 使用特定的标志位重置流状态(这里是一个示例,实际上通常不需要这样做)  
    file.clear(std::ios::failbit); //重置failbit  
  
    return 0;  
}

4、管理输出缓冲

每个输出流都管理一个缓冲区,用来保存程序读写的数据。
导致缓冲区刷新的原因(数据真正写道输出设备或者文件)的原因有:

  1. 程序结束,main函数中的return语句。

  2. 缓冲区满了。

  3. 使用操作符(如endl、flush、ends)显示刷新。

    cout << "hi!" << endl;  //输出hi和换行,然后刷新
    cout << "hi!" << flush; //输出hi,然后刷新
    cout << "hi!" << ends;  //输出hi和一个空字符,然后刷新
    
  4. 在每个输出操作符之后,我们可以用unitbuf设置流的内部状态,来清空缓冲区。

    在C++中,std::ios_base::unitbuf 是一个控制标志,用于控制流缓冲区的行为。当设置了 unitbuf 标志时,流会在每次插入操作(如 << 输出操作符)后立即刷新其缓冲区,这意味着输出将不会被缓存,而是直接写入到其关联的设备(如文件、控制台等)中。

    std::ofstream file("file.txt");
    // 设置unitbuf标志,使每次输出后都刷新缓冲区  
    file.setf(std::ios::unitbuf);  
    // 写入一些文本到文件,每次写入后都会刷新缓冲区  
    file << "Hello, " << "world!" << std::endl;  
    
    // 你可以通过unsetf取消unitbuf的设置  
    // file.unsetf(std::ios::unitbuf);  
    

    简单方式

    cout << unitbuf;    //所有输出都会刷新缓冲区
    cout << nounitbuf;  //返回正常缓冲方式
    
  5. 一个流可能被关联到另一个流。这是当读写被关联流时,关联到流的缓冲区会被刷新。

    例如:cin和cerr都被关联到cout。因此,读cin或者写cerr都会导致cout缓冲区刷新。

二、文件输入输出

fstream中独特的操作。

操作 描述
fstream fstrm; 创建一个未绑定的文件流。fstream 是头文件 fstream 中定义的一个类型。
fstream fstrm(s); 创建一个 fstream 对象,并打开名为 s 的文件。默认的文件模式(mode)依赖于 fstream 的类型。
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定的 mode 打开文件。mode 可以是如 std::ios::instd::ios::outstd::ios::appstd::ios::binary 等的组合。
fstrm.open(s); 打开名为 s 的文件,并将文件与 fstrm 绑定。默认的文件模式(mode)依赖于 fstream 的类型。
fstrm.open(s, mode); 打开名为 s 的文件,并将文件与 fstrm 绑定,同时指定打开模式 mode
fstrm.close(); 关闭与 fstrm 绑定的文件。返回 void
fstrm.is_open(); 返回一个 bool 值,指出与 fstrm 关联的文件是否成功打开且尚未关闭。

1、使用文件流对象

标签:std,文件,file,fstream,fstrm,IO,缓冲区
From: https://www.cnblogs.com/baobaobashi/p/18212407

相关文章

  • A Simple Framework for Open-Vocabulary Segmentation and Detection
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!ProceedingsoftheIEEE/CVFInternationalConferenceonComputerVision.2023. Abstract  1.Introduction 2.RelatedWork 3.Method3.1.BasicLossFormulation 3.2.BridgeTaskGap:Decou......
  • Gradio官方学习文档(二)
    一、队列多用户访问Gradioapp排队机制,支持的类:gr.Interface,gr.Blocks,andgr.ChatInterface示例:#在类后使用queue()函数,设定`default_concurrency_limit`=5(不声明,默认值为1)demo=gr.Interface(...).queue(default_concurrency_limit=5)demo.launch()二、流式......
  • Gradio官方文档学习记录(一)
    一、Gradio基本使用方式:Gradio是一个开源的Python包,允许您快速为您的机器学习模型、API或任意Python函数构建演示或Web应用程序。然后,您可以使用Gradio内置的分享功能在几秒钟内分享您的演示或Web应用程序链接。无需JavaScript、CSS或Web主机经验。基本使用:importgradi......
  • 【爆肝分享】AI绘图Stable Diffusion-ComfyUI 从入门到精通完整学习教程资料,AI绘图高
    「前言」自从2022年stablediffusion横空出世以来,AI绘图正以其强大的表现能力与惊人的迭代速度极大的改变了建筑师设计与表现的工作流程。无论是利用AI的随机性与可控性进行项目构思。▲AI体块造型构思亦或是利用AI辅助建筑表现。▲AI线稿精准控图甚至使用AI进行......
  • GCC编译遇到“a label can only be part of a statement and a declaration is not a
    问题原因:switch中case里面的局部变量出错解决方法:将case里面定义的局部变量在switch外面定义。//报错情况switch(fork()){case-1:error(1,errno,"fork");case0://子进程执行命令if(execvp(args[0]......
  • Elevate Your Lead Generation Game with Maps Scraper AI
    RevolutionizingLeadGenerationTransformingLeadAcquisitionMapsScraperAIintroducesagroundbreakingapproachtoleadgenerationbyautomatingtheextractionofvaluabledatafromBingMapslistings.Thisinnovativemappingtoolstreamlinestheproce......
  • 在 Azure AI Studio 中创建项目并使用聊天演练场
    在AzureAIStudio中创建项目并使用聊天演练场See:CreateaprojectandusethechatplaygroundinAzureAIStudio-AzureAIStudio|MicrosoftLearn在本动手实验中,你将创建项目,部署聊天模型,然后在AzureAIStudio中的演练场中使用它。本动手实验包括:在AzureA......
  • 【Spring】spring的IoC概念
    1、IoC的基本概念IoC,即控制反转,是一种设计思想,用于降低代码之间的耦合度。在传统的程序设计中,对象的创建和对象之间的依赖关系通常由对象自身来管理。而在IoC思想中,这种控制权被“反转”了,交由一个外部容器(在Spring中就是IoC容器)来管理。IoC也被称为依赖注入(DependencyInject......
  • 【Linux】icmp_seq=1 Destination Host Unreachable
    执行ping命令提示:From192.168.XX.XX  icmp_seq=1DestinationHostUnreachable这个错误消息通常表示以下几种情况之一:网络连接问题:目标主机可能没有连接到网络,或者网络中的某个路由器无法将数据包转发到目标主机。目标主机不存在:目标主机的IP地址可能不存在,或者......
  • CMU 15-445 Lecture #05: Storage Models & Compression笔记总结(上)
    这是cmu15-445第五节课程StorageModels&Compression的上半部分,主要包括StorageModels的内容,压缩部分下次再整理,学完这部分可以去做hw2的第一部分课程主页:CMU15-445/645::IntrotoDatabaseSystems(Fall2023)(有几张图片目前没上传,过两天补一下)DatabaseWorkloads......