首页 > 其他分享 >第27章 使用流进行输入和输出

第27章 使用流进行输入和输出

时间:2024-05-09 10:55:07浏览次数:26  
标签:std 输出 27 文件 ios myFile base open 输入

1 流的概述

C++流是读写(输入与输出)逻辑的通用实现,让用户能够用统一的模式读写数据。不管是磁盘或键盘读取数据,还是将输入写入显示器或磁盘,模式都一样
用于写入流时,运算符<<被称为流插入运算符,可将其用于写入屏幕、文件等;从流中读取数据时,运算符>>被称为流提取运算符,可将其用于从键盘、文件等读取输入

2 流类和流对象

类/对象 用途
cout
cin
cerr
fstream
ofstream
ifstream
stringstream

cout、cin、cerr分别是流类ostream、istream、ostream的全局对象,其在main()开始前就已初始化
使用流类时,可指定控制符

类/对象 用途
输出控制符
endl
ends
基数控制符
dec
hex
oct
浮点数表示控制符
fixed
scientific
< iomanip > 控制符
setprecision
setw
setfill
setbase
setiosflag
resetiosflag

3 std::cout:将指定格式的数据写入控制台

3.1 修改数字显示格式

3.2 对齐文本和设置字段宽度

4 std::in进行输入

4.1 将输入读取到基本类型变量

4.2 使用std::cin:get将输入读取到cha* 缓冲区

在读取c风格字符串时,可以将输入直接写入char数组:

char charBuf[10]={0};
cin>>charBuf;

当用户输入超过10个字符时比较危险,数组缓冲区越界导致程序崩溃。更好的方法是:

char charBuf[10]={0};
cin.get(charBuf,9);

尽量不使用char数组,只要允许应该使用std::string

4.3 将输入读取到std::string中

示例:

int main(){
cout<<"Enter your name: ";
string name;
cin>>name;
cout<<"Hi "<<name<<endl;
}

输出:
Enter your name: Siddhartha Rao
Hi Siddhartha
由于cin遇到空白后就停止插入,所以只显示了名字
要读取整行输入(包括空白),需使用getline(),修改如下:

int main(){
cout<<"Enter your name: ";
string name;
getline(cin,name);
cout<<"Hi "<<name<<endl;
}

输出:
Enter your name: Siddhartha Rao
Hi Siddhartha Rao

5 使用std::fstream处理文件

std::fstream旨在以独立于平台的方式访问文件。其从std::ofstream继承了写入文件的功能,从std::ifstream继承了读取文件的功能。要使用std::fstream类或其基类,需包含头文件

5.1 使用open()和close()打开和关闭文件

要写入数据到文件或者从文件读取数据,首先使用方法open()打开文件:

fstream myFile;
myFile.open("HelloFile.txt",ios_base::in|ios_base::out|ios_base::trunc);

if(myFile.isopen()){ //检查文件是否打开
  //读或写操作
  myFile.close();
}

open()接受两个参数:

  • 第一个是要打开的文件路径和名称(若没有提供路径,将假定为应用程序的当前目录)

  • 第二个是文件的打开模式,有以下几种

    • ios_base::app:附加到现有文件末尾,而不是覆盖
    • ios_base::ate:切换到文件末尾,但可在文件任何位置写入数据
    • ios_base::trunc:覆盖现有文件,这是默认设置
    • ios_base::binary:创建二进制文件
    • ios_base::in:以只读方式打开文件
    • ios_base::out:以只写方式打开文件

建议在使用文件流对象前,使用is_open()检查文件打开操作是否成功
保存到文件时,必须使用close()关闭文件流

也可使用构造函数打开文件流:

fstream myFile("HelloFile.txt",ios_base::in|ios_base::out|ios_base::trunc);

如果只想打开文件进行写入,可使用如下代码:

ofstream myFile("HelloFile.txt",ios_base::out);

如果只想打开文件进行读取,可使用如下代码:

ifstream myFile("HelloFile.txt",ios_base::in);

5.2 使用open()创建文本文件和运算符<<写入文本

#include<fstream>
#include<iostream>
using namespace std;

int main()
{
   ofstream myFile;
   myFile.open("HelloFile.txt", ios_base::out);

   if (myFile.is_open())
   {
      cout << "File open successful" << endl;
	  
      myFile << "My first text file!" << endl;
      myFile << "Hello file!";

      cout << "Finished writing to file, will close now" << endl;

      myFile.close();
   }
   return 0;
}

5.3 使用open()和运算符>>读取文本

#include<fstream>
#include<iostream>
#include<string>

using namespace std;

int main()
{
   ifstream myFile;
   myFile.open("HelloFile.txt", ios_base::in);

   if (myFile.is_open())
   {
      cout << "File open successful. It contains: " << endl;
      string fileContents;
      while (myFile.good())
      {
        getline (myFile, fileContents);
        cout << fileContents << endl;
      }
      cout << "Finished reading file, will close now" << endl;

      myFile.close();
   }
   else
      cout << "open() failed: check if file is in right folder" << endl;
   return 0;
}

5.4 读写二进制文件

#include<fstream>
#include<iomanip>
#include<string>
#include<iostream>

using namespace std;

struct Human
{
   Human() {};
   Human(const char* inName, int inAge, const char* inDOB) : age(inAge)
   {
      strcpy(name, inName);
      strcpy(DOB, inDOB);
   }

   char name[30];
   int age;
   char DOB[20];
};

int main()
{
   Human Input("Siddhartha Rao", 101, "May 1916");

   ofstream fsOut ("MyBinary.bin", ios_base::out | ios_base::binary);

   if (fsOut.is_open())
   {
     cout << "Writing one object of Human to a binary file" << endl;
     fsOut.write(reinterpret_cast<const char*>(&Input), sizeof(Input));
     fsOut.close();
   }
   ifstream fsIn ("MyBinary.bin", ios_base::in | ios_base::binary);
   if(fsIn.is_open())
   {
      Human somePerson;

      fsIn.read((char*)&somePerson, sizeof(somePerson));
      cout << "Reading information from binary file: " << endl;
      cout << "Name = " << somePerson.name << endl;
      cout << "Age = " << somePerson.age << endl;
      cout << "Date of Birth = " << somePerson.DOB << endl;
   }
   return 0;
}

6 使用std::stringstream对字符串进行转换

要使用std::stringstream类,需要包含头文件

标签:std,输出,27,文件,ios,myFile,base,open,输入
From: https://www.cnblogs.com/xdhisgood-xy/p/18180640

相关文章

  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......
  • 代码随想录算法训练营第一天 | 704.二分查找 27.移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文档讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715左闭右开时间复杂度O(logn)空间复杂度O(1)classSolution{public:intsearch(......
  • UIOTOS前端零代码应用 蓝图连线+嵌套封装 实现MQTT输入0、1切换门禁开和关
    目标通过连线+嵌套封装,实现MQTT数据推送前端控制门禁开关最终效果实现过程步骤1:新建一个页面,在工具函数input输入两个门禁的开关图标地址,再通过连线和解析实现输0、1切换图标。 步骤2:再插入图片按钮,通过连线和解析,把工具函数的输出传递给图片按钮组件的path属性。 步骤......
  • C++基础-如何引入第三方静态库、动态库或自定义库 摘自 https://blog.csdn.net/u01310
    C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具VisualStudio中的操作静态库(.lib)静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,......
  • 27.企业微信-L2
    importrequestsclassTestWework:deftest_get_token(self):self.corp_id="ww0500b1708efeb406"self.corp_secret="5fas7s3wQzC6k5W11SqZ1dxMcXvC57yKXi_NMVXu4pkBNY"self.base_url="https://qyapi.weixi11n.qq.......
  • 2024-05-08:用go语言,给定一个由正整数组成的数组 nums, 找出数组中频率最高的元素, 然后
    2024-05-08:用go语言,给定一个由正整数组成的数组nums,找出数组中频率最高的元素,然后计算该元素在数组中出现的总次数。输入:nums=[1,2,2,3,1,4]。输出:4。答案2024-05-08:chatgpt题目来自leetcode3005。大体步骤如下:1.创建一个空的字典cnt用于存储每个元素的出现次数。2......
  • 27-Spring源码分析(二)
    AOP源码分析1.AOP概述AOP(AspectOrientProgramming)利用代理模式,通过代理对象对被代理的对象增加功能。所以,关键在于AOP框架自动创建AOP代理对象,代理模式分为静态代理和动态代理。AspectJ使用静态代理,编译时增强,在编译期生成代理对象;SpringAOP使用动态代理,运行时......
  • 【GD32】---- 使用GD32调试串口并实现printf打印输出
    1复制工程模板直接复制工程模板里的系统文件和固件库文件到新的工程文件01_USART_Printf2新建keil工程参考上一篇博文:【GD32】----移植工程模板及点灯测试3编写代码3.1创建USART文件创建一个USART.c文件,放于05_UserDriver文件夹中USART.h/********************......
  • 【Python-Json】自定义类输入json序列化、json的读取与写入
    AI问答Questionjson支持numpy数组么Answer不幸的是,标准的JSON格式不直接支持NumPy数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包括对象(object)、数组(array)、数字(number)、字符串(string)、布尔值(true/false)、空值(null)等.因此,无法直接将......
  • blazor中的PageTitle输出keywords和description,自定义组件
    在blazor的PageTitle中不具备输出keywords和description的功能,而如果直接使用<mate>标签,输出中文时会变成乱码,所以我给大家推介下面的代码解君愁:1@*<PageTitle>@Title-@AppTitle</PageTitle>*@2<HeadContent>3@(newMarkupString($"<metaname=\"keywords\"......