转 C++输入输出文件流

2023-11-04

https://blog.csdn.net/qq_29924041/article/details/74360461
C++学习:在C++中的文件输入和文件输出

简介:
在C语言中,我们有fread和fwrite用于文件的输入和输出,在java中我们也有inputStream和outPutStream输入输出流,在C++语言中,同样为我们封装了自己的输入ifstream,输出流ofstream,当然C++是面向对象的,所以调用的方式上可能跟C有点点小小的区别
ifstream和ofstream都是fstream的子类

提示:

博主:章飞_906285288
博客地址:http://blog.csdn.net/qq_29924041

简单介绍下文件io流下的一些相关函数
文件打开方式属性

属性 作用
ios::in 供读,文件不存在则创建(ifstream默认的打开方 式)
ios::out 供写,文件不存在则创 建,若文件已存在则清空原内容(ofstream默认的打开方式)
ios::ate 文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
ios::app 供写,文件不存在则创建,若文件已存在则在原文件内容后写入 新的内容,指针位置总在最后
ios::trunc 在读写前先将文件长度截断为0(默认)
ios::nocreate 文件不存在时产生错误,常和in或app联合使用
ios::noreplace 文件存在时产生错误,常和out联合使用
ios::binary 二进制格式文件
文件保护方式选择项:

属性 作用
filebuf::openprot 默认的兼容共享方式
filebuf::sh_none 独占,不共享
filebuf::sh_read 读共享
filebuf::sh_write 写共享
文件流的打开方式

ifstream f(“a.txt”, ios::nocreate);         //默认以 ios::in 的方式打开文件,文件不存在时操作失败
ofstream f(“a.txt”);                //默认以 ios::out的方式打开文件
fstream  f(“a.dat”, ios::in|ios::out|ios::binary); //以读 写方式打开二进制文件
1
2
3
文件的关闭

ifstream file(“a.txt”);
fi.close(); //使用完毕之后需要关闭
1
2
文件打开成功的判断

1:直接使用返回流来进行判断
ifstream file(“a.txt”,ios::out);
if(file){
//
}
2:使用good函数来进行判断,或者也可以用来判断写的东西是否正确
if(file.good()){
//打开成功的判断
}
如:good()是没有任何类型检查的
while(file.good()){
cin >> num;
}
3:可以使用is_open()来判断是否打开
file.open(“a.txt”);
if(file.is_open()){
//打开成功
}
当然如果判断打开失败,则可以用!来表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
判断读取到文件的尾部EOF,使用函数eof()

伪代码:

instream infile("a.txt");
if(infile){
    while(!infile.eof()){
        //如果没有读取到文件文件尾部
    }
}

1
2
3
4
5
6
文件io流的读写操作:

1:字符输入输出
使用>>和<<来进行读写操作,只能来进行文本操作,读取二进制可能会出错
2:字节输入:
使用write和read函数来进行读写操作
1
2
3
4
文件io流来获取读写的字节数

getcount()函数,返回的就是读写的字节数
1
随机进行文件的读写操作
随机读写函数:

seekg(绝对位置);      //绝对移动,    //输入流操作
seekg(相对位置,参照位置);  //相对操作
tellg();          //返回当前指针位置
seekp(绝对位置);      //绝对移动,    //输出流操作
seekp(相对位置,参照位置);  //相对操作   
tellp();          //返回当前指针位置
1
2
3
4
5
6
随机读写的标志位:

属性 作用
fios::beg 相对于文件头
ios::cur 相对于当前位置
ios::end 相对于文件尾
重要提示:

因为文件输入输出也是属于io流中的,所以适用于cout和cin的属性设置的,对文件流来所也是适用的,具体的可以参考C++IO流的api

C++中简单的输出流
执行步骤:

  1. 必须包含头文件fstream
  2. 头文件fstream定义了一个用于处理输出的ofstream
  3. 需要声明一个或者多个ofstream对象,并以自己喜欢的方式对其进行命名,条件是遵守常用命名规则
  4. 必须指明命名空间std,例如:为引用元素ofstream,必须使用变异指令using或者前缀std::;
  5. 必须将ofstream对象与文件进行关联起来,为此方法之一就是open()方法
  6. 使用完毕文件之后需要将其关闭,使用close()方法
  7. 可以结合使用ofstream对象和操作符来输出各种文件类型的数据
    注意:
    虽然头文件中提供了预先定义好的cout的ostream对象,但是也必须要声明自己的ofstream对象,并且为其命名.并且将同文件关联起来
    声明一个对象关联起来,便可以像cout一样使用它,所有可用于cout的操作方法( << ,endl,setf())都是可以用于ofstream对象的

记住创建好outFile之后,就可以像cout一样去使用它了

示例代码:

/*

  • ===========================================================================
  •   Filename:  ofsteam.cpp
    
  • Description:
  •    Version:  1.0
    
  •    Created:  2017年07月06日 22时31分24秒
    
  •   Revision:  none
    
  •   Compiler:  gcc
    
  •     Author:   (), 
    
  •    Company:  
    
  • ===========================================================================
    */

#include
#include
using namespace::std;

int main(int agrc,char* argv[]){
ofstream outFile;
char automobile[50];
int year;
double a_price;
double b_price;

//创建并且打开文件(没有则创建,有则覆盖)
outFile.open(“carinfo.txt”,ios::out);
cout << “Enter the make and model of automobile;”;
cin.getline(automobile,50);
cout <<“Enter the model year:”;
cin >> year;
cout << “Enter the origin asking price:”;
cin >> a_price;

b_price = 0.913 * a_price;

cout << fixed;
cout.precision(2);//保留两位小数点
cout.setf(ios_base::showpoint); //设置展现小数点
cout << “make the model:” <<automobile <<endl;
cout <<“Year:”<<year;
cout <<“a_price:”<<a_price<<endl;
cout <<“b_price:”<<b_price<<endl;

//打开成功 也可以适用outFile.good()
if(outFile){
outFile.precision(2); //向设置cout一样设置保留位数
outFile << fixed; //一般的方式输出浮点数
outFile.setf(ios_base::showpoint);//展示小数点

outFile << "make the model:"<<automobile <<endl; //使用<<将文本输入到文件中去
outFile <<"year:"<<year<<endl;
outFile <<"a_price:"<<a_price<<endl;
outFile <<"b_price" <<b_price<<endl;

}

//关闭文本文件输出流
outFile.close();

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
 具体的结果就不在这里进行输出,有兴趣的copy执行,代码取自C++primer

C++中简单的输入流
执行步骤:

必须包含头文件fstream
头文件fstream定义了一个用处理输出的ifstream类
需要声明一个或者多个ifstream变量对象,并且以自己喜欢的方式对其命名,条件是遵守常用的命名规则
必须指明命名空间std
需要将ifstream对象与文件关联起来,方法之一就是open()
使用完毕之后,应使用close()方法将其关闭
可以结合使用ifstream对象和操作符<<来读取各种数据类型的数据
可以使用ifstream对象和get方法来读取一个字符,使用ifstream对象和getline来读取一行字符
可以结合使用ifstream和eof()检查文件是否到尾部,fail()检查是否类型不匹配等方法来判断输入是否成功
ifstream对象本身被用作测试条件的时候,如果最后一个读取操作成功,他将被转换成布尔值true,否则为false

注意:

1:虽然头文件iostream中提供了一个预定义好的名为cin和istream对象,但是必须声明自己的ifstream对象,为其命名,并且将其与文件关联起来
2:方法open()接受一个C风格字符串做为参数,还可以是一个字面字符串,也可以是存储在数组中的字符串
3:与文件关联起来后,能够使用在cin上的操作,都可以使用在ifstream的对象上
4:使用is_open()判断检查文件是否打开了,太老的编译器可能不支持

inFile.open(“a.txt”);
if(!inFile.is_open()){
exit(1);
}
1
2
3
4
5:论文件打开的重要性:

打开失败的原因
1:指定文件不存在
2:文件目录错误
3:用户输错了文件名字
4:访问被拒绝(访问权限问题)
1
2
3
4
5
6:读取文件的时候有几点需要检查的地方:

1:程序读取文件的时候不应该超过EOF(文件结尾的符号),如果读到EOF或者eof()为true
2:程序可能遇到一些读取类型不匹配的情况
3:某些预期之外的东西,如文件受损或硬件故障等.
1
2
3
示例代码

/*

  • ===========================================================================
  •   Filename:  ifstream.cpp
    
  • Description:
  •    Version:  1.0
    
  •    Created:  2017年07月07日 21时48分41秒
    
  •   Revision:  none
    
  •   Compiler:  gcc
    
  •     Author:   (), 
    
  •    Company:  
    
  • ===========================================================================
    */

#include
#include
#include<stdlib.h>
using namespace::std;

const int SIZE = 50;

int main(int argc,char* argv[]){
ifstream inFile;
char content[50];
/inFile.open(“carinfo.txt”,ios::in);
if(inFile.is_open()){
while(!inFile.eof()){
inFile.getline(content,50);
cout << content << endl;
}
}
/

char fileName[SIZE];
cout << “Enter a name of File:”;
cin.getline(fileName,SIZE);
inFile.open(fileName,ios::in);/打开文件/
if(!inFile.is_open()){
cout<<“open file is error”<< endl;
exit(1);
}

while(inFile.good()){
inFile.getline(content,50);
cout << content << endl;
}
if(inFile.eof()){/判断是否到了文件尾部/
cout << “End of File reached”<< endl;
}else if(inFile.fail()){/判断是否是类型不匹配或者磁盘错误/
cout << “Input by Data mismatched” <<endl;
}else {/未知错误/
cout << “unknow reason” <<endl;
}

inFile.close();/关闭文件/

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
结合文件输入和输出写的一个文件拷贝工具类
/*

  • ===========================================================================
  •   Filename:  copyTest.cpp
    
  • Description:
  •    Version:  1.0
    
  •    Created:  2017年07月07日 22时07分41秒
    
  •   Revision:  none
    
  •   Compiler:  gcc
    
  •     Author:   (), 
    
  •    Company:  
    
  • ===========================================================================
    */

#include
#include
#include<string.h>
#include<stdlib.h>
using namespace::std;

const int SIZE = 50;

int main(int argc,char* argv[]){
ifstream inFile;
ofstream outFile;
char inFileName[SIZE];
char outFileName[SIZE];

char buffer;
char buffer2[20];

cout << “Enter a src file name:”;
cin.getline(inFileName,SIZE);
cout << “Enter a des file name:”;
cin.getline(outFileName,SIZE);

inFile.open(inFileName,ios::in | ios::binary);
if(!inFile.is_open()){
cout << “open src file error”<<endl;
inFile.close();
exit(1);
}
outFile.open(outFileName,ios::out | ios::binary);
if(!outFile.is_open()){
cout <<“open des file error”<<endl;
inFile.close(); //注意在return的时候将流关闭
outFile.close();
exit(1);
}
int num;
while(inFile.good()){
inFile.read(buffer2,sizeof(buffer2));
num = inFile.gcount();//获取读取的字节
outFile.write(buffer2,num);

//inFile.get(buffer);//读取字符流
//outFile << buffer;//将字符流写入

}
if(inFile.eof()){
cout << “end of input”<< endl;
}else if(inFile.fail()){
cout << “dismatched”<<endl;
}else {
cout <<“unknow”<<endl;
}

inFile.close();
outFile.close();
return 0;
}

作者:_ 小小码nong
来源:CSDN
原文:https://blog.csdn.net/qq_29924041/article/details/74360461
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转 C++输入输出文件流 的相关文章

随机推荐

  • 创客科学竞赛

    谈起令学习机器人教育的孩子最兴奋的事情是什么 那恐怕就是机器人科技竞赛了 格物斯坦小坦克认为参加机器人竞赛的有益之处太多 首先塑造参与意识 培养学习积极性 让孩子从被动学习到主动学习的最佳锻炼方法就是把知识运用到实践当中 塑造勇敢 自信的个
  • Docker安装MySQL和Redis

    docker 安装中间件 1 Linux安装docker 1 centos安装docker 1 卸载之前的docker sudo yum remove docker docker client docker client latest do
  • shell 脚本关键字&符号

    shell概念 shell 既是一种解释型编程语言 也是一个这种编程语言的解释器的名字 shell是解释型语言 就是解释器会一条一条的翻译每一条语句并执行 对比之下 C语言是编译型语言 编译器把整个工程编译成可执行文件才能执行 在没有续行符
  • PostMan接口测试(很全面的接口测试教程)

    一 理论部分 1 前言 在前后端分离开发时 后端工作人员完成系统接口开发后 需要与前端人员对接 测试调试接口 验证接口的正确性可用性 而这要求前端开发进度和后端进度保持基本一致 任何一方的进度跟不上 都无法及时完成功能模块的测试 做为后端开
  • java BigDecimal 保留两位小数

    在 Java 中 可以使用 setScale 方法来设置 BigDecimal 对象的小数位数 以下是一个例子 演示了如何将 BigDecimal 对象保留两位小数 BigDecimal number new BigDecimal 3 14
  • 图片,图集打入ab包的依赖关系、Include in build

    我们将ab包解开之后 发现一张图片打成ab包里面包含有1张sprite和一张texture2d 这是因为我们没有打图集 unity自动给我们生成了单张图片的图集 这样不利于ui合批 打包图片 未打图集 一个文件夹 n张图片 打入一个ab包
  • C#去掉文件夹或文件名非法字符

  • HP电脑安转虚拟机搭建ubuntu环境

    下载虚拟机vmstation 下载ubuntu iso文件 安转vmstation 进入bios打开虚拟化硬件开关 配置网络代理以及dns 使得可以上网 主要修改 etc apt apt conf文件 以及 etc resolv conf配
  • Pytest固件fixture用法

    fixture是pytest特有的功能 它用 pytest fixture标识 定义在函数前面 在编写测试函数的时候 可以将此函数的名称作为传入参数 pytest会以依赖注入方式将该函数的返回值作为测试函数的传入参数 fixture主要的目
  • SpringBoot整合Dubbo

    Dubbo简介 Dubbo是Alibaba开源的分布式服务框架 它最大的特点是按照分业务的架构 使用这种方式可以使各个业务之间解耦合 或者最大限度地松耦合 简单来说Dubbo 一款分布式服务框架 高性能和透明化的RPC远程服务调用方案 SO
  • nsight 初级使用指南

    1 安装 没有什么特殊设置 2 打开vs 编译生成你需要分析的 exe 在vs上方菜单 有nsight menu choose Start Graphics Debugging 3 在弹出对话框中选择 ok或connect unsecure
  • 云服务器文件传送,云服务器文件传送

    云服务器文件传送 内容精选 换一换 ISO是一种光盘映像文件 通过特定的压缩方式 将大量的数据文件统一为一个后缀名为iso的映像文件 ISO文件可以理解为从光盘中复制出来的数据文件 所以ISO文件无法直接使用 需要利用一些工具进行解压后才能
  • 熟悉数据结构(一)【JavaScript】

    文章目录 1 剑指 Offer 05 替换空格 2 剑指 Offer 06 从尾到头打印链表 3 剑指 Offer 09 用两个栈实现队列 4 剑指 Offer 20 表示数值的字符串 5 剑指 Offer 24 反转链表 1 剑指 Off
  • 114. 二叉树展开为链表-二叉树

    https leetcode cn com problems flatten binary tree to linked list 解题思路 本题观察最后链表从头至尾的顺序正好是前序遍历的结果 所以考虑将前序遍历结果进行存储然后再进行相应的
  • win10注册mysql服务_win10下搭建MySQL服务

    1 下载MySQL安装包 滑动到页面底部 官网提供了不同电脑位数 32 64位 的下载版本 我的电脑是win10 64位的 选择对应版本下载解压包 如果你没有注册登录下载页面时 官网会提示你注册一个账号进行下载 当然你也可以选择just s
  • 【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测

    MATLAB第63期 基于MATLAB的改进敏感性分析方法IPCC 拥挤距离与皮尔逊系数法结合实现回归与分类预测 思路 考虑拥挤距离指标与PCC皮尔逊相关系数法相结合 对回归或分类数据进行降维 通过SVM支持向量机交叉验证得到平均指标 来判
  • 如何炸开(分解)CAD多重插入块

    新建一个空白文本文档 然后将下面 红色 代码复制到里面并保存 将文件名以及后缀名改成unlk lsp defun c unlk en ent setq en entsel n请选择被加密的图形 if en if cdr assoc 0 se
  • ES按资源类型统计个数

    一 目标 统计各类型资源的个数 输出详细报表 http 10 10 6 225 9200 dsideal db t resource info mapping properties RESOURCE FORMAT type text fie
  • Qt编写的遮罩层窗体

    PS 亲测有效 转 http www qtcn org bbs read htm tid 62394 html 最近接了个私活 需要在弹框的窗体背后遮罩原有主窗体 使得突出显示弹窗窗体 突然想到之前写过一个全局截屏的东东 原理一致 拿来改改
  • 转 C++输入输出文件流

    https blog csdn net qq 29924041 article details 74360461 C 学习 在C 中的文件输入和文件输出 简介 在C语言中 我们有fread和fwrite用于文件的输入和输出 在java中我们