c++ ifstream 文件输入流 打开方式 既然不能用iftream对象进行写入操作,为
c++ifstream文件输入流打开方式既然不能用iftream对象进行写入操作,为什么还要用ios::out打开方式呢ifstreamin("filename",ios...
c++ ifstream 文件输入流 打开方式
既然不能用iftream对象进行写入操作,为什么还要用ios::out打开方式呢
ifstream in("filename",ios::in|ios::out)
oftream对象我也有相同的疑问 展开
既然不能用iftream对象进行写入操作,为什么还要用ios::out打开方式呢
ifstream in("filename",ios::in|ios::out)
oftream对象我也有相同的疑问 展开
展开全部
std::ios::out 和 std::ios::in是作用于流的内部缓冲区的,分别指定内部缓冲区支持输出和输入操作,C++的输入输出流实际的IO操作都是由内部缓存区实现的,输入流和输出流用的内部缓冲区都是同一个类型(std::streambuf)。 你问题中的代码可能实现的就是这个效果,即同时支持输入和输出。ifstream没有提供输出的接口,所以你不能使用ifstream进行输出。
看看下面的代码:
#include <fstream>
#include <iostream>
#include <string>
int main() {
// 创建输入流,std::ios::out指定内部缓冲区支持输出操作,std::ios::trunc避免文件不存在的情况以及截断文件。
std::ifstream input { "test.txt", std::ios::in | std::ios::trunc | std::ios::out };
if( input ) {
// 保存std::cout的内部缓冲区.
auto oldRdbuf = std::cout.rdbuf();
// 将input的内部缓冲区与std::cout共享.
std::cout.rdbuf( input.rdbuf() );
// 输出字符串,注意这里的字符串将输出到input打开的文件中.
std::cout << "Hello, this message came from std::cout!" << std::endl;
// 读取刚才输出的字符串
std::string line;
// 一定要设置文件指针,因为输出操作会改变文件指针.
input.seekg( 0, std::ios::beg );
if( std::getline( input, line ) ) {
// 恢复std::cout原先的内部缓冲区
std::cout.rdbuf( oldRdbuf );
// 输出读取的字符串
std::cout << line << std::endl;
}
}
system( "pause" );
}
上面的代码实现了input和std::cout共享内部缓冲区,由于input创建的时候添加了std::ios::out标记,所以std::cout后续的输出操作都可以成功实现,如果去掉这个标记,std::cout的输出操作就会失败!
建议不要写这种代码,容易让别人疑惑,如果需要同时输出和输出,应该是用std::fstream流。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询