C++输入输出和文件操作

文章目录

  • C++输入输出和文件操作
    • 一、输入输出
      • 1.输入输出相关的类
        • ①与输入输出流操作相关的类:
        • ②标准流对象:
        • ③判断输入流结束:
        • ④istream类的成员函数:
        • ⑤重定向输入输出:
      • 2.流操纵算子
        • ①整数流的基数:
        • ②控制浮点数精度的流操纵算子:
        • ③设置域宽的流操纵算子:
        • ④用户自定义流操纵算子:
    • 二、文件读写
      • 1.创建文件
      • 2.读写文件
        • ①文件的读写指针:
        • ②字符文件的读写:
        • ③二进制文件的读写:
        • ④二进制文件和文本文件的区别:
      • 3.关闭文件

一、输入输出

1.输入输出相关的类

①与输入输出流操作相关的类:

  • istream是用于输入的流类,cin就是该类的对象。
  • ostream是用于输出的流类,cout就是该类的对象。
  • ifstream是用于从文件读取数据的类。
  • ofstream是用于向文件写入数据的类。
  • iostream是既能用于输入,又能用于输出的类。
  • fstream 是既能从文件读取数据,又能向文件写入数据的类。

②标准流对象:

  • 输入流对象:

    • cin 与标准输入设备相连

      cin对应于标准输入流,用于从键盘读取数据,也可以被重定向为从文件中读取数据。

  • 输出流对象:

    • cout 与标准输出设备相连

      cout对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件写入数据。

    • cerr , clog 与标准错误输出设备相连

      cerr , clog对应于标准错误输出流,用于向屏幕输出出错信息。
      cerrclog的区别在于cerr不使用缓冲区,直接向显示器输出信息;而输出到clog中的信息先会被存放在缓冲区,缓冲区满或者刷新时才输出到屏幕。

      说明:缺省情况下以下三种相同

      cerr << "Hello,world" << endl;
      
      clog << "Hello,world" << endl;
      
      cout << "Hello,world" << endl;
      

③判断输入流结束:

可以用如下方法判输入流结束:

 int x;while (cin >> x){......}
  • 如果是从文件输入,比如前面有freopen(“some.txt”,”r”,stdin);那么,读到文件尾部,输入流就算结束
  • 如果从键盘输入,则在单独一行输入Ctrl+Z代表输入流结束

④istream类的成员函数:

istream & getline(char * buf, int bufSize);

从输入流中读取bufSize-1个字符到缓冲区buf,或读到碰到‘\n’为止(哪个先到算哪个)。

istream & getline(char * buf, int bufSize,char delim);

从输入流中读取bufSize-1个字符到缓冲区buf,或读到碰到delim字符为止(哪个先到算哪个)。两个函数都会自动在buf中读入数据的结尾添加’\0’。,’\n’或 delim都不会被读入buf,但会被从输入流中取走。如果输入流中 ‘\n’或delim之前的字符个数达到或超过了bufSize个,就导致读入出错,其结果就是:虽然本次读入已经完成,但是之后的读入就都会失败了。
可以用 if(!cin.getline(…)) 判断输入是否结束

⑤重定向输入输出:

  • 输出重定向:将标准输出重定向到 test.txt文件

    freopen("test.txt","w",stdout);
    
  • 输入重定向:cin被改为从 t.txt中读取数据

    freopen(“t.txt”,“r”,stdin);
    

2.流操纵算子

使用流操纵算子需要 #include <iomanip>

①整数流的基数:

流操纵算子dec(十进制),oct(八进制),hex(十六进制)

 int n = 10;cout << n << endl;cout << hex << n << "\n"<< dec << n << "\n"<< oct << n << endl;

输出结果:
10
a
10
12

②控制浮点数精度的流操纵算子:

  • precision, setprecision

    • precision是成员函数,其调用方式为:

      cout.precision(5);
      
    • setprecision 是流操作算子,其调用方式为:
      cout << setprecision(5); // 可以连续输出
      
  • 功能:定点&非定点

    • 指定输出浮点数的有效位数(非定点方式输出时)
      默认方式为非定点方式输出:

      #include <iostream>
      #include <iomanip>
      using namespace std;
      int main()
      {double x = 1234567.89, y = 12.34567;int n = 1234567;int m = 12;cout << setprecision(6) << x << endl<< y << endl<< n << endl<< m;
      }
      

      输出:
      1.23457e+006
      12.3457
      1234567
      12

    • 指定输出浮点数的小数点后的有效位数(定点方式输出时)
      定点方式:小数点必须出现在个位数后面

      • 以小数点位置固定的方式输出setiosflags(ios::fixed)

        #include <iostream>
        #include <iomanip>
        using namespace std;
        int main()
        {double x = 1234567.89, y = 12.34567;int n = 1234567;int m = 12;cout << setiosflags(ios::fixed) << setprecision(6) << x << endl<< y << endl<< n << endl<< m;
        }
        

        输出:
        1234567.890000
        12.345670
        1234567
        12

      • 取消以小数点位置固定的方式输出resetiosflags(ios::fixed)

        #include <iostream>
        #include <iomanip>
        using namespace std;
        int main()
        {double x = 1234567.89;cout << setiosflags(ios::fixed) << setprecision(6) << x << endl<< resetiosflags(ios::fixed) << x;
        }
        

        输出:
        1234567.890000
        1.23457e+006

③设置域宽的流操纵算子:

  • 设置域宽setw,width
    两者功能相同,一个是成员函数,另一个是流操作
    算子,调用方式不同:
    cin >> setw(4); 或者 cin.width(5);
    cout << setw(4); 或者 cout.width(5);

  • 宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度。

    int w = 4;
    char string[10];
    cin.width(5);
    while (cin >> string)
    {cout.width(w++);cout << string << endl;cin.width(5);
    }
    

    输入:
    1234567890
    输出:
    1234
    _5678
    ____90

④用户自定义流操纵算子:

ostream &tab(ostream &output)
{return output << '\t';
}
cout << "aa" << tab << "bb" << endl;

输出:aa____bb

因为 iostream 里对 << 进行了重载(成员函数)

ostream & operator <<( ostream & ( * p ) ( ostream & ) ) ;

该函数内部会调用p所指向的函数,且以 *this 作为参数hex 、dec 、oct 都是函数

二、文件读写

1.创建文件

  • 文件和流:
    可以将顺序文件看作一个有限字符构成的顺序字符流,然后像对cin, cout 一样的读写。

  • 包含头文件:

    #include <fstream>
    
  • 创建文件:

    • 方法一:直接创建ofstream对象

      ofstream outFile("file.dat", ios::out|ios::binary);
      
      • 要创建的文件的名字:file.dat
      • 文件打开方式:
        ios:out 输出到文件, 删除原有内容
        ios::app 输出到文件, 保留原有内容,总是在尾部添加
      • ios::binary 以二进制文件格式打开文件
    • 方法二:可以先创建ofstream对象,再用 open函数打开

      ofstream fout;
      fout.open("test.out", ios::out | ios::binary);
      
    • 判断打开是否成功:

      if( !fout)
      {cout << “File open error !”<< endl;
      }
      
    • 文件名可以给出绝对路径,也可以给相对路径。没有交代路径信息,就是在当前文件夹下找文件

  • 绝对路径和相对路径

    • 绝对路径(有盘符)

      "c:\\tmp\\mydir\\some.txt"
      
    • 相对路径(从当前文件夹出发)

      "\\tmp\\mydir\\some.txt"
      

      当前盘符的根目录下的tmp\dir\some.txt

      "tmp\\mydir\\some.txt"
      

      当前文件夹的tmp子文件夹里面的……

      "..\\tmp\\mydir\\some.txt"
      

      当前文件夹的父文件夹下面的tmp子文件夹里面的……

      "..\\..\\tmp\\mydir\\some.txt"
      

      当前文件夹的父文件夹的父文件夹下面的tmp子文件夹里面的……

2.读写文件

①文件的读写指针:

标识文件操作的当前位置, 该指针在哪里,读写操作就在哪里进行。location 可以为负值

  • 写指针:

    ofstream fout("a1.out", ios::app); //以添加方式打开
    long location = fout.tellp();      //取得写指针的位置
    location = 10;
    fout.seekp(location);           // 将写指针移动到第10个字节处
    fout.seekp(location, ios::beg); //从头数location
    fout.seekp(location, ios::cur); //从当前位置数location
    fout.seekp(location, ios::end); //从尾部数location
    
  • 读指针

    ifstream fin(“a1.in”, ios::ate);
    //打开文件,定位文件指针到文件尾
    long location = fin.tellg(); //取得读指针的位置
    location = 10L;
    fin.seekg(location);           // 将读指针移动到第10个字节处
    fin.seekg(location, ios::beg); //从头数location
    fin.seekg(location, ios::cur); //从当前位置数location
    fin.seekg(location, ios::end); //从尾部数location
    

②字符文件的读写:

因为文件流也是流,所以流的成员函数和流操作算子也同样适用于文件流。
例:将文件 in.txt 里面的整数排序后,输出到out.txt

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{vector<int> v;ifstream srcFile("in.txt", ios::in);ofstream destFile("out.txt", ios::out);int x;while (srcFile >> x)v.push_back(x);sort(v.begin(), v.end());for (int i = 0; i < v.size(); i++)destFile << v[i] << " ";destFile.close();srcFile.close();return 0;
}

③二进制文件的读写:

  • ifstream 和 fstream的成员函数:

    istream& read (char* s, long n);
    

    将文件读指针指向的地方的n个字节内容,读入到内存地址s,然后将文件读指针向后移动n字节 (以ios::in方式打开文件时,文件读指针开始指向文件开头) 。

    istream& write (const char* s, long n);
    

    将内存地址s处的n个字节内容,写入到文件中写指针指向的位置,然后将文件写指针向后移动n字节(以ios::out方式打开文件时,文件写指针开始指向文件开头, 以ios::app方式打开文件时,文件写指针开始指向文件尾部 ) 。

  • 例:在文件中写入和读取一个整数

    #include <iostream>
    #include <fstream>
    using namespace std;
    int main()
    {ofstream fout("some.dat", ios::out | ios::binary);int x = 120;fout.write((const char *)(&x), sizeof(int));fout.close();ifstream fin("some.dat", ios::in | ios::binary);int y;fin.read((char *)&y, sizeof(int));fin.close();cout << y << endl;return 0;
    }
    

④二进制文件和文本文件的区别:

  • Linux,Unix下的换行符号:‘\n’ (ASCII码: 0x0a)
  • Windows 下的换行符号:‘\r\n’ (ASCII码: 0x0d0a) endl 就是 ‘\n’
  • Mac OS下的换行符号: ‘\r’ (ASCII码:0x0d)

导致 Linux, Mac OS 文本文件在Windows 记事本中打开时不换行

  • Unix/Linux下打开文件,用不用 ios::binary 没区别
  • Windows下打开文件,如果不用 ios::binary,则:
    • 读取文件时,所有的 ‘\r\n’会被当做一个字符’\n’处理,即少读了一个字符’\r’。
    • 写入文件时,写入单独的’\n’时,系统自动在前面加一个’\r’,即多写了一个’\r’

3.关闭文件

显式关闭文件:

ifstream fin("test.dat", ios::in);
fin.close();
ofstream fout("test.dat", ios::out);
fout.close();

【知识索引】【C++入门】

【C++入门】C++ 输入输出和文件操作相关推荐

  1. 《Python入门到精通》文件操作

    「作者主页」:士别三日wyx   此文章已录入专栏<Python入门到精通>   2021最新版Python小白教程,针对0基础小白和基础薄弱的伙伴学习 文件操作 1. 打开文件 1.1 ...

  2. c/c++入门教程 - 2.5 文件操作、fstream(write写文件、read读文件、ios::binary二进制文件读写)

    目录 2.5 文件操作 2.5.1 文本文件 2.5.1.1 写文件 2.5.1.2 读文件 2.5.2 二进制文件 2.5.2.1 二进制写文件 2.5.2.2 二进制读文件 2.5 文件操作 程序 ...

  3. Python入门学习笔记——12.文件操作

    ##################################################### # 1.文件写入 # 写入操作 ''' 1.打开文件 open()参数1:文件路径路径 ur ...

  4. java 运算符输入_java-运算符,IO输入输出,文件操作

    Java 运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 ...

  5. 【C/C++语言入门篇】-- 文件操作

    [C/C++语言入门篇]-- 文件操作 收藏 此文于2010-03-09被推荐到CSDN首页 如何被推荐? 最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起.之前本打算这个模块就结束了,文件操 ...

  6. 文件操作01 - 零基础入门学习C语言60

    第十一章:文件操作01 让编程改变世界 Change the world by program C文件概述 所谓"文件"是指一组相关数据的有序集合.这个数据集有一个名称,叫做文件名 ...

  7. java输入输出及文件_java输入输出流及文件操作

    我只选择了一些代码 注意包声明和相关结构 许多类都继承了MyFile这个类 深入研究可以参考<java文件操作> 1.[代码]读取文件内容 /** *Author:Yuanhonglong ...

  8. C/C++语言入门篇 -- 文件操作

    最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起.之前本打算这个模块就结束了,文件操作就不写了,但是文件操作又是一个很重要的东西,而且也刚好能够总结之前我们学习的所有知识.同时也为了将文件操作 ...

  9. python从入门到大神---4、python3文件操作最最最最简单实例

    python从入门到大神---4.python3文件操作最最最最简单实例 一.总结 一句话总结: python文件操作真的很简单,直接在代码中调用文件操作的函数比如open().read(),无需引包 ...

最新文章

  1. ArrayList的subList方法
  2. Android人脸支付研究,智能手机上人脸支付系统的设计与实现
  3. MQTT client id重复导致连接失败
  4. 基本数据类型float和double的区别
  5. 那些数学不好的程序员?最后都如何了(文末送书)
  6. leetcode 516. Longest Palindromic Subsequence | 516. 最长回文子序列(递归 -> 傻缓存 ->DP)
  7. 一不小心,知乎炸了!
  8. Mat详解-OpenCV
  9. nssl1458-HR 的疑惑【枚举】
  10. spring mvc学习(35):restful的put
  11. nginx+tomcat+redis实现session共享
  12. 爬虫下载百度贴吧图片
  13. Ribbon界面开发:如何创建Ribbon样式的应用程序框架
  14. 笔记本计算机(Legion)快捷键(加快编辑速度)
  15. cmd find 命令 多个 或者 关系 +windows_使用 rush 进行命令并行处理
  16. 室内定位算法_【好设计论文】基于行人航迹推算的室内定位算法研究
  17. java jsonsql_java遍历解析json数据并插入到数据库中(MySQL)
  18. android——(图片框与进度条)
  19. 一个简单的C语言计算器(当作复习C语言基础的一个小程序)
  20. 猿创征文|深入剖析多态的实现原理与虚函数指针

热门文章

  1. Educoder 机器学习 神经网络 第四关:使用pytorch搭建卷积神经网络识别手写数字
  2. jetson windows_生命不息,折腾不止:Jetson Nano填坑之软件篇
  3. idea 一键展开所有方法 一键收纳所有方法
  4. Postman工具(环境变量与全局变量)
  5. 敏感性分析算法 程序_计算机程序设计艺术(TAOCP)精读笔记1 - 算法分析真正应该有的样子 Part 1...
  6. python中全局变量_玩转Python,使用全局变量
  7. 树莓派 ubuntu gpio_如何给树莓派安装操作系统
  8. python68个内置函数_直接在python中检索68个内置函数?
  9. python入门教程收藏_python入门教程:超详细保你2小时学会Python,快来收藏看看...
  10. php修改学生信息代码_论导师和学生关于论文写作最大的信息不对称(一):从初稿到定稿到底要修改几遍?...