c++输入输出流

一、文件输入流

ifstream ifs("explicit.cc");

if(! ifs.good()){

cerr << "ifs open file fail !" << endl;

return;

}

1、按行读取

string line;

while(getline(ifs,line)){

cout << line << endl;

}

2、读取一个文件的全部内容

tellg用来获取游标位置,seekg用来设置游标位置。

string filename= "explicit.cc";

ifstream ifs(filename);

if(!ifs){

cerr <<"ifs open file fail !";

return;

}

//读取一个文件的所有内容,先要获取文件的大小,将游标放到了文件的最后。

ifs.seekg(0,std::ios::end);

long length = ifs.tellg();

cout << length << endl;

char * pdata = new char[[length + 1]();

//需要将游标再放置到文件开头

ifs.seekg(0,std::ios::beg);

ifs.read(pdata,length);

3、读取一个文件的所有内容,每次读取20个字节

#include <fstream>

#include <iostream>

int main()

{

    std::ifstream file("filename.txt", std::ios::binary);

    if (!file)

    {

        std::cerr << "无法打开文件" << std::endl;

        return 1;

    }

    char buffer[20]; // 用于存储每次读取的20个字节

    while (file.read(buffer, sizeof(buffer)))

    {

        for (size_t i = 0; i < file.gcount(); ++i)

        {

            std::cout << buffer[i];

        }

    }

  // 检查是否还有未处理的字符(由于最后一次读取可能不足20个字节)  
    if (file.gcount() > 0) {  
        // 输出剩余的部分  
        for (size_t i = 0; i < file.gcount(); ++i) {      
            std::cout << buffer[i];      
        }  
    }

    // 检查文件是否因为到达末尾而退出循环,或者因为其它原因(如错误)

    if (file.eof())

    {

        std::cout << "到达文件末尾" << std::endl;

    }

    else if (file.fail())

    {

        std::cerr << "读取文件时发生错误" << std::endl;

    }

    file.close(); // 关闭文件,但在c++中,当ifstream对象销毁时会自动关闭。所以这里file.close();不是必须的。

    return 0;

}

  1. gcount()用于返回最近一次未格式化的输入操作(如 read()get()getline()ignore() 等)中提取的字符数。
  2. 在C++的std::ifstream中,read函数并不要求每次必须读取固定数量的字节。read函数的第二个参数是一个std::streamsize类型的值,它指定了最多要读取的字节数。  

  • 如果文件中有足够的字节可以读取,read函数会尝试读取指定数量的字节。

  • 如果文件中剩余的字节少于指定的数量,read函数会读取所有剩余的字节,并设置流的状态标志eofbit来表示已经到达文件末尾。
  • 如果在读取过程中发生错误(如磁盘错误),read函数会设置流的状态标志failbitbadbit。    

 3、如果文件 filename.txt 的大小不是 buffer(即20个字节)的整数倍,那么在最后一次循环时,file.read(buffer, sizeof(buffer)) 只会读取剩余的部分(少于20个字节),但是您的输出循环仍然会尝试输出整个 buffer 的内容,导致最后一次可能会输出乱序字符。

 额外补充:

一、void perror(const char *str); perror("Error opening file");  // 使用 perror 打印错误描述  。当你调用 perror(msg),它将执行以下操作:

  1. 首先,它将尝试打印出你提供的字符串 msg(如果有的话)。
  2. 然后,它会在 msg 后面添加一个冒号(:)和一个空格。
  3. 接着,它会打印出与当前 errno 值对应的错误描述。

errno 是一个全局变量,用于存储最近一次系统调用或库函数调用的错误代码。当系统调用或库函数调用失败时,通常会设置 errno 来表示发生了什么错误。perror()是C语言专属的。在c++中,可以使用异常处理机制(try/catch块)来处理错误。

二、exit(1); 是一个库函数调用,用于立即终止程序的执行。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值