当前位置:   article > 正文

3622 · 用 Read4 读取 N 个字符_力扣 java 158. 用 read4 读取 n 个

力扣 java 158. 用 read4 读取 n 个

描述

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

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

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

样例

样例 1

输入:

 
  1. "lintcode"
  2. 5

输出:

 
  1. 5
  2. lintc

解释:

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

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

解释:

这段代码是一个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个字符。如果有可用的数据源且没有达到文件末尾,就一直读取直到满足条件为止。
 

 代码实现:

  1. int read4(char* buf);
  2. class Solution {
  3. public:
  4. /**
  5. * @param buf: destination
  6. * @param n: the number of characters that need to be read
  7. * @return: the number of characters read
  8. */
  9. char buf4[4];
  10. int read(char* buf, int n) {
  11. // write you code here
  12. int readnumber=0;bool eof=false;int cnt=0;
  13. while(readnumber<n&&!eof)
  14. {
  15. cnt=read4(buf4);//buf4读入最多四个字符
  16. if(cnt<4) eof=true;
  17. int m_cnt=min(n-readnumber,cnt);
  18. for(int i=0;i<m_cnt;i++)
  19. {
  20. buf[readnumber++]=buf4[i];
  21. }
  22. }
  23. return readnumber;
  24. }
  25. };

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号