c++ ifstream 文件输入流 打开方式 既然不能用iftream对象进行写入操作,为

c++ifstream文件输入流打开方式既然不能用iftream对象进行写入操作,为什么还要用ios::out打开方式呢ifstreamin("filename",ios... c++ ifstream 文件输入流 打开方式
既然不能用iftream对象进行写入操作,为什么还要用ios::out打开方式呢
ifstream in("filename",ios::in|ios::out)
oftream对象我也有相同的疑问
展开
 我来答
帐号已注销
2017-02-06 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1236万
展开全部

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流。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式