fstream 的用法——文件拷贝

本文提供了一个使用C++标准库进行文件拷贝的示例代码,通过ifstream和ofstream来读取和写入二进制文件,展示了如何高效地复制文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自 http://blog.sina.com.cn/s/blog_700a65cc0100mieb.html  
当ifstream read到文件尾,返回0值,其它时候返回非0值。下面给出一个用C++标准库实现文件拷贝的函数:
 
#include<iostream>
#include<fstream>
#include<string>
usingnamespace std;
 
constint BUFSIZE = 1024 * 1024;
 
void CopyRawFile(string InFile, string OutFile)
{
     char* pchar = newchar[BUFSIZE];
 
     ofstream ofile;
     ifstream ifile;
 
     ofile.open(OutFile.c_str(), ios::binary);
     ifile.open(InFile.c_str(), ios::binary);
 
     while(ifile.read(pchar, BUFSIZE))
         ofile.write(pchar, BUFSIZE);
 
     ofile.write(pchar, ifile.gcount());
     ifile.close();
     ofile.close();
     delete []pchar;
}
### C++ 文件输入输出流的用法C++ 中,文件输入输出流可以通过 `fstream` 头文件中的类来实现。这些类包括 `ifstream`(用于读取)、`ofstream`(用于写入)以及 `fstream`(可以同时进行读写)。以下是关于如何使用这些类的具体说明。 #### 1. 基本概念 C++文件操作基于流的概念,类似于控制台输入输出的操作方式。对于文件输入输出,程序需要创建相应的流对象并与指定的文件关联起来。一旦建立了这种关联关系,就可以像处理标准输入输出那样对文件执行数据交换[^2]。 #### 2. 包含必要的头文件 为了能够使用文件流功能,必须先包含 `<fstream>` 头文件: ```cpp #include <fstream> ``` 此头文件提供了三个主要的类:`std::ifstream`, `std::ofstream`, 和 `std::fstream`。 #### 3. 打开文件 要打开一个文件以便对其进行访问,需调用对应流对象的构造函数或者其成员方法 `open()` 来完成初始化工作。下面是一些常见的模式及其含义: - **只读模式 (in)**: 创建一个 `ifstream` 对象并将其绑定到目标文件上。 ```cpp std::ifstream inputFile("example.txt"); ``` - **只写模式 (out)**: 利用 `ofstream` 类型的对象连接至待修改或新建的目标位置。 ```cpp std::ofstream outputFile("output.txt"); ``` - **可读可写模式**: 如果希望既可以从现有文档中获取资料又能向其中添加新内容,则应该选用双向支持类型的容器——也就是前面提到过的第三个类别 fstream 实例化后的实体形式 ```cpp std::fstream bothFile("both.txt", std::ios::in | std::ios::out); ``` 注意,在某些情况下可能还需要额外设置标志位参数以满足特定需求比如追加而非覆盖原有记录等情形下的行为调整等等[^2]。 #### 4. 数据交互过程 当成功建立好上述任一方向上的链接之后即可按照常规手段来进行实际的数据传输动作了。例如利用重载版本号大于符号(`>>`)作为提取器从源端拉取信息;反之则采用小于等于号(`<`)充当插入者角色推送所需存储的信息进入目的地之中去。 ##### 阅读示例: 假设有一个名为 "data.txt" 的纯文本档案存在当前目录下,并且里面包含了若干整数值分行排列好了的话那么我们可以这样编写一段简单的测试代码片段如下所示: ```cpp int number; while(inputFile >> number){ cout << number << endl; } if(!inputFile.eof()){ cerr<<"Error reading file"<<endl; } ``` 这段脚本首先声明了一个变量用来保存每次循环过程中取得的新项目接着在一个无限期持续运行直到遇到错误条件为止(即到达EOF之前一直重复下去)期间每一次迭代都会尝试把下一个可用条目赋给number然后再打印出来如果最后发现并不是因为正常结束而是由于其他异常情况引起的终止就会给出提示消息指出哪里出了差错[^2]. ##### 写作示范: 同样地如果我们想要往另一个叫做results.dat二进制格式储存结果集里边填充一些计算出来的浮点数序列也可以参照类似的逻辑结构构建相应部分的功能模块如下列伪码所展示的一样: ```cpp double result = calculateSomething(); outputFile.write(reinterpret_cast<char*>(&result), sizeof(result)); // 或者更简洁的方式就是直接运用<<运算符 outputFile<<scientific<<setprecision(6)<<result<<"\n"; ``` 在这里我们先是得到了某个具体的数值随后借助write()函数手动指定了内存地址范围从而实现了精确度较高的原始字节级拷贝操作另外还展示了另一种更加直观易懂的方法那就是通过格式化的字符串拼接技术达到相同的目的只不过后者可能会稍微牺牲一点性能而已不过考虑到大多数应用场景下这点差异完全可以忽略不计所以推荐优先考虑后者除非确实有特殊要求才回退前者[^2]. #### 5. 关闭文件 无论何时完成了所有的I / O活动都应该记得及时释放资源关闭相关联的通道以免造成不必要的浪费甚至引发潜在的安全隐患等问题因此建议养成良好的习惯每做完一件事情就马上清理现场恢复初始状态具体做法很简单只需要简单调用close()就可以了. ```cpp inputFile.close(); // Close the input stream. outputFile.close(); // Close the output stream. bothFile.close(); // Close the read/write stream. ``` 以上便是有关于C ++当中涉及到文件系统的几个基本知识点介绍希望能够帮助大家更好地理解和掌握这部分重要内容. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值