C++ IO 文件流:使用 operator<< 和 rdbuf() 从一个文件写入另一个文件
C++ IO file streams: writing from one file to another using operator<< and rdbuf()
我有一个关于使用运算符<<将数据从一个文件复制到另一个文件的问题C++(fstream(。这是一个对我有用的代码片段:
#include <fstream>
#include <string>
void writeTo(string &fname, ofstream &out){
ifstream in;
in.open(fname.c_str(),fstream::binary);
if(in.good()){
out<<in.rdbuf();
in.close();
}else{
//error
}
}
我想确定在写入后,流in
中的输入文件的末尾已经到达。但是,如果我测试in.eof()
,它是false
,尽管检查输入和输出文件确认整个内容已被正确复制。关于如何检查in.eof()
的任何想法?
EOF 位是在尝试读取字符时设置的,但没有可用的(即您已经使用了字符串中的所有内容(。显然std::ostream::operator<<()
不会尝试读取字符串的末尾,因此永远不会设置位。
您应该能够通过尝试访问下一个字符来解决此问题:在检查in.eof()
之前添加in.peek()
。我已经测试了此修复程序,它可以工作。
输入文件中未设置任何状态位的原因是您正在阅读streambuf
,而不是istream
;实际的阅读发生在ostream::operator<<
,没有访问istream
.
但是,我不确定这是否重要。 输入将被读取,直到 streambuf::sgetc
返回EOF
. 这将导致eofbit
如果您正在通读istream
,则设置在istream
中。 这如果您正在阅读 istream
是如果streambuf::sgetc
抛出异常,这将导致 badbit
设置为istream
;没有提供其他机制以报告读取错误的输入streambuf
。 所以把你的out <<
in.rdbuf()
包在一个try ... catch
块中,并希望实现实际上确实检查了硬件错误。 (我最近没有检查,但是许多早期的实现完全忽略了读取错误,将它们作为文件的正常结尾。
当然,由于您实际上是在读取字节(尽管<<
,我不明白如何调用此格式化输入(,您不必考虑第三个可能的错误来源,即格式错误(例如输入 int 时的"abc"(。
尝试in.rdbuf()->sgetc() == EOF
.
参考: http://www.cplusplus.com/reference/iostream/streambuf/sgetc/
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- C++试图读取一个文件并输出到另一个文本文件
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++ 如何打开带有另一个目录的输入文件?
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- 如何在另一个 CPP 文件中使用一个 cpp 文件中的函数?
- 使用 scope 运算符 (::) 引用另一个文件中的类
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 使用命名空间在另一个".cpp"文件中定义
- 在 c++ 中打开文件、删除标点符号并追加到另一个文件中
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?