• Time:O(n)
• Space:O(1)

## C++

``````/**
*/

class Solution {
public:
/**
* @param buf Destination buffer
* @param n   Number of characters to read
* @return    The number of actual characters read
*/
int read(char* buf, int n) {
int i = 0;  // buf's index

while (i < n) {
if (i4 == n4) {      // all characters in buf4 are consumed
i4 = 0;            // reset buf4's index
n4 = read4(buf4);  // read 4 (or less) chars from file to buf4
if (n4 == 0)       // reach the EOF
return i;
}
buf[i++] = buf4[i4++];
}

return i;
}

private:
char* buf4 = new char[4];
int i4 = 0;  // buf4's index
int n4 = 0;  // buf4's size
};
``````

## JAVA

``````/**
*/

public class Solution extends Reader4 {
/**
* @param buf Destination buffer
* @param n   Number of characters to read
* @return    The number of actual characters read
*/
public int read(char[] buf, int n) {
int i = 0; // buf's index

while (i < n) {
if (i4 == n4) {     // all characters in buf4 are consumed
i4 = 0;           // reset buf4's index
n4 = read4(buf4); // read 4 (or less) chars from file to buf4
if (n4 == 0)      // reach the EOF
return i;
}
buf[i++] = buf4[i4++];
}

return i;
}

private char[] buf4 = new char[4];
private int i4 = 0; // buf4's index
private int n4 = 0; // buf4's size
}
``````

## Python

``````# The read4 API is already defined for you.
# def read4(buf4: List[str]) -> int:

class Solution:
def read(self, buf: List[str], n: int) -> int:
i = 0  # buf's index

while i < n:
if self.i4 == self.n4:  # all characters in buf4 are consumed
self.i4 = 0  # reset buf4's index
self.n4 = read4(self.buf4)  # read 4 (or less) chars from file to buf4
if self.n4 == 0:  # reach the EOF
return i
buf[i] = self.buf4[self.i4]
i += 1
self.i4 += 1

return i

buf4 = [' '] * 4
i4 = 0  # buf4's index
n4 = 0  # buf4's size
``````

• Time:O(n)
• Space:O(1)

## C++

``````/**
*/

class Solution {
public:
/**
* @param buf Destination buffer
* @param n   Number of characters to read
* @return    The number of actual characters read
*/
int read(char* buf, int n) {
int i = 0;  // buf's index

// put remaining chars in buf4 to buf
while (i4 < n4 && i < n)
buf[i++] = buf4[i4++];

// while not reaching the tail (< 4 chars)
while (i + 4 < n) {
const int k = read4(buf + i);  // directly write to buf
if (k == 0)                    // reach the EOF
return i;
i += k;
}

// reach the tail
while (i < n) {
if (i4 == n4) {      // all characters in buf4 are consumed
i4 = 0;            // reset buf4's index
n4 = read4(buf4);  // read 4 (or less) chars from file to buf4
if (n4 == 0)       // reach the EOF
return i;
}
buf[i++] = buf4[i4++];
}

return i;
}

private:
char* buf4 = new char[4];
int i4 = 0;  // buf4's index
int n4 = 0;  // buf4's size
};
``````