3622 · 用 Read4 读取 N 个字符

描述

在本题中,你需要通过设计 read() 函数将文件的前 n 个字符读取并保存至 buf 中,并返回读取的字符串长度。

你无法直接访问该文件,你需要通过 read4() 函数间接读取该文件。其中 read4() 函数每次固定读取 4 个字符,多次调用则会从上一次读取的结果后继续读取。同样地,该函数也会返回实际读取到的字符串长度。

你可以在样例中查看更多解释。

样例

样例 1

输入:

 
"lintcode"
5

输出:

 
5
lintc

解释:

文件的内容为 lintcode,第一次调用 read4() 读取到 lint,而第二次再此调用只需读取第 5 个字符(c)即可。所以最终读取的字符串为 lintc,长度为 5。

int read4(char* buf);

class Solution {
public:
    /**
     * @param buf: destination
     * @param n: the number of characters that need to be read
     * @return: the number of characters read
     */
    char buf4[4];
    int read(char* buf, int n) {
        int readCnt=0;//读取字符数
        bool eof = false;//标记文件末尾
        while(readCnt<n && !eof){//读取字符数小于n且没有到文件末尾
          int cnt = read4(buf4);//每次读取最多四个字符
          if(cnt<4) eof = true;//小于4说明已经读取到了文件末尾,结尾标记eof变为true,跳出循环
          int delta = min(n-readCnt, cnt);//每次循环实际需要复制的字符数,使用min函数避免超过目标缓冲区
          for(int i=0;i<delta;i++){
            buf[readCnt++] = buf4[i];//将读取字符复制到缓冲区域
          }
        }
        return readCnt;//返回读取字符数
    }
};

解释:

这段代码是一个C++程序,其中定义了一个类Solution,这个类有一个公有成员函数read和一个函数read4。

函数read看起来是用来从一个数据源中读取字符到一个目标缓冲区。它使用了一个循环,循环条件是readCnt<n && !eof,即当已经读取的字符数小于n并且没有达到文件结束标记(eof)时,就继续读取。

在循环体内,首先通过调用函数read4(buf4)读取数据,然后判断读取的字符数cnt是否小于4,如果小于4,则将eof设置为true,表示已经到达文件末尾。

然后使用min(n-readCnt, cnt)计算出实际需要复制的字符数delta,这里使用min函数是为了避免复制的字符数超过目标缓冲区的大小。

最后,通过一个for循环将读取的字符复制到目标缓冲区中,复制完成后,readCnt自增,进入下一次循环。

当已经读取的字符数达到n或者到达文件末尾时,循环结束,函数返回已经读取的字符数。

需要注意的是,函数read4并没有在代码中给出实现,我们可以推断这个函数的功能应该是从数据源中读取最多4个字符到数组buf4中。另外,这个函数应该是文件流相关的函数,因为函数中使用了文件结束标记eof。

这个代码的目的是从数据源中读取最多n个字符到目标缓冲区中,其中每次最多读取4个字符。如果有可用的数据源且没有达到文件末尾,就一直读取直到满足条件为止。
 

 代码实现:

int read4(char* buf);

class Solution {
public:
    /**
     * @param buf: destination
     * @param n: the number of characters that need to be read
     * @return: the number of characters read
     */
      char buf4[4];
    int read(char* buf, int n) {
        // write you code here
       
        int readnumber=0;bool eof=false;int cnt=0;
        while(readnumber<n&&!eof)
        {
            cnt=read4(buf4);//buf4读入最多四个字符
            if(cnt<4) eof=true;
            int m_cnt=min(n-readnumber,cnt);
            for(int i=0;i<m_cnt;i++)
            {
                buf[readnumber++]=buf4[i];
            }

        }
        return readnumber;
        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值