golang bufio.Read or bufio.ReadByte to detect if file is at EOFCan read(2) return zero when not at EOF?Reading specific number of bytes from a buffered reader in golangRace conditions in io.Pipe?How to test EOF on io.Reader in Go?Golang dynamic sizing slice when reading a file using buffo.readEmpty return in func with return value in golanggolang: net.Conn: check conn statusGolang copy from *os.file without hanging on waiting for EOFRead exactly n bytes unless EOF?After called Peek method, the origin data has changedHow to read huge files with samll ram in golang?
practicality of 30 year fix mortgage at 55 years of age
Is it acceptable to say that a reviewer's concern is not going to be addressed because then the paper would be too long?
Lost Update Understanding
Received a package but didn't order it
Is there any relation/leak between two sections of LM358 op-amp?
How to see the previous "Accessed" date in Windows
extracting sublists
Cut a cake into 3 equal portions with only a knife
Why does this image of Jupiter look so strange?
Which place in our solar system is the most fit for terraforming?
What is the difference between an astronaut in the ISS and a freediver in perfect neutral buoyancy?
Is the mass of paint relevant in rocket design?
Labview vs Matlab??Which one better for image processing?
Do we know the situation in Britain before Sealion (summer 1940)?
Symbol for function composition like a big sum
Golf (6-card) Golf!
Why is a road bike faster than a city bike with the same effort? & how much faster it can be?
A file manager to open a zip file like opening a folder, instead of extract it by using a archive manager
Line segments inside a square
Going to France with limited French for a day
Proper way to shut down consumer
How to create fractional SI units (SI...sqrts)?
What are the consequences of high orphan block rate?
What should I consider when deciding whether to delay an exam?
golang bufio.Read or bufio.ReadByte to detect if file is at EOF
Can read(2) return zero when not at EOF?Reading specific number of bytes from a buffered reader in golangRace conditions in io.Pipe?How to test EOF on io.Reader in Go?Golang dynamic sizing slice when reading a file using buffo.readEmpty return in func with return value in golanggolang: net.Conn: check conn statusGolang copy from *os.file without hanging on waiting for EOFRead exactly n bytes unless EOF?After called Peek method, the origin data has changedHow to read huge files with samll ram in golang?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I wish to confirm there are no more bytes to be read from a buffered reader (neither from the internal buffer, nor from the underlying file object) by trying to read one more byte (and catching EOF).
Is using bufio.Read
or bufio.ReadByte
suitable for this purpose?
It's not clear from the bufio.Read
documentation whether or not the integer returned can be zero, in non-EOF cases. Namely, is 0, nil
a valid return value if len(p) > 0
?
func (b *Reader) Read(p []byte) (n int, err error)
Read reads data into p. It returns the number of bytes read into p. The bytes are taken from at most one Read on the underlying Reader, hence n may be less than len(p). To read exactly len(p) bytes, use io.ReadFull(b, p). At EOF, the count will be zero and err will be io.EOF.
Similarly, the bufio.ReadByte
documentation doesn't separate error cases from EOF cases very well, and it doesn't exactly define what it means by "available" (i.e. available in the internal buffer, or available in the underlying file)?
func (b *Reader) ReadByte() (byte, error)
ReadByte reads and returns a single byte. If no byte is available, returns an error.
go
add a comment
|
I wish to confirm there are no more bytes to be read from a buffered reader (neither from the internal buffer, nor from the underlying file object) by trying to read one more byte (and catching EOF).
Is using bufio.Read
or bufio.ReadByte
suitable for this purpose?
It's not clear from the bufio.Read
documentation whether or not the integer returned can be zero, in non-EOF cases. Namely, is 0, nil
a valid return value if len(p) > 0
?
func (b *Reader) Read(p []byte) (n int, err error)
Read reads data into p. It returns the number of bytes read into p. The bytes are taken from at most one Read on the underlying Reader, hence n may be less than len(p). To read exactly len(p) bytes, use io.ReadFull(b, p). At EOF, the count will be zero and err will be io.EOF.
Similarly, the bufio.ReadByte
documentation doesn't separate error cases from EOF cases very well, and it doesn't exactly define what it means by "available" (i.e. available in the internal buffer, or available in the underlying file)?
func (b *Reader) ReadByte() (byte, error)
ReadByte reads and returns a single byte. If no byte is available, returns an error.
go
add a comment
|
I wish to confirm there are no more bytes to be read from a buffered reader (neither from the internal buffer, nor from the underlying file object) by trying to read one more byte (and catching EOF).
Is using bufio.Read
or bufio.ReadByte
suitable for this purpose?
It's not clear from the bufio.Read
documentation whether or not the integer returned can be zero, in non-EOF cases. Namely, is 0, nil
a valid return value if len(p) > 0
?
func (b *Reader) Read(p []byte) (n int, err error)
Read reads data into p. It returns the number of bytes read into p. The bytes are taken from at most one Read on the underlying Reader, hence n may be less than len(p). To read exactly len(p) bytes, use io.ReadFull(b, p). At EOF, the count will be zero and err will be io.EOF.
Similarly, the bufio.ReadByte
documentation doesn't separate error cases from EOF cases very well, and it doesn't exactly define what it means by "available" (i.e. available in the internal buffer, or available in the underlying file)?
func (b *Reader) ReadByte() (byte, error)
ReadByte reads and returns a single byte. If no byte is available, returns an error.
go
I wish to confirm there are no more bytes to be read from a buffered reader (neither from the internal buffer, nor from the underlying file object) by trying to read one more byte (and catching EOF).
Is using bufio.Read
or bufio.ReadByte
suitable for this purpose?
It's not clear from the bufio.Read
documentation whether or not the integer returned can be zero, in non-EOF cases. Namely, is 0, nil
a valid return value if len(p) > 0
?
func (b *Reader) Read(p []byte) (n int, err error)
Read reads data into p. It returns the number of bytes read into p. The bytes are taken from at most one Read on the underlying Reader, hence n may be less than len(p). To read exactly len(p) bytes, use io.ReadFull(b, p). At EOF, the count will be zero and err will be io.EOF.
Similarly, the bufio.ReadByte
documentation doesn't separate error cases from EOF cases very well, and it doesn't exactly define what it means by "available" (i.e. available in the internal buffer, or available in the underlying file)?
func (b *Reader) ReadByte() (byte, error)
ReadByte reads and returns a single byte. If no byte is available, returns an error.
go
go
edited Mar 28 at 17:40
init_js
asked Mar 28 at 0:47
init_jsinit_js
1,38210 silver badges28 bronze badges
1,38210 silver badges28 bronze badges
add a comment
|
add a comment
|
1 Answer
1
active
oldest
votes
Passing a buffer of length 1 to bufio.Read
, when the reader is backed with an underlying os.File, will indeed return n==0, io.EOF
if the file is at EOF.
The documentation is being a bit imprecise because some of the behavior depends on the underlying reader you pass to the bufio
reader. The code for bufio.Read()
draws a more accurate picture. I'll outline the logic.
bufio.Read
: Only issues a Read
to the underlying reader if all bytes in the internal buffer have been exhausted. So, presumably, if you've already read as many bytes from the buffered reader as the number of bytes in the underlying file, that internal buffer should be exhausted when you make the last call bufio.Read(buf[0:1])
to check for EOF.
When the internal buffer is exhausted, and you ask the bufio
reader for more, bufio.Read
will do at most one call to the underlying reader. The type of error you get then will depend on your underlying reader.
Asking to read for n > 0
bytes from an os.File
when the read pointer is already at EOF should return 0, io.EOF
(according to the doc on os.File File.Read
). But if your underlying reader was something else, perhaps a custom type specific to your application designed to return 0, nil
at EOF, then bufio.Read
would echo that back instead.
bufio.ReadByte
: The logic behind bufio.ReadByte
is slightly different but the outcome should be the same as bufio.Read
in cases where the underlying reader is an os.File
. The main difference with bufio.Read
is that bufio.ReadByte
can make several attempts to refill the internal buffer. If an error is encountered during refilling (which will be the case for a os.File
reader at EOF), it is returned after the first erroneous read attempt. So, if your underlying Reader is an os.File
reader, then you'll get 0, io.EOF
if and only if your underlying file is at EOF. If your underlying reader was a custom reader type that only returned 0, nil
at EOF, then bufio.ReadByte
would eventually emit a "NoProgress" error. I'm not sure why the retry logic is only in bufio.ReadByte
, but the good news is that either option can be used if your underlying file behaves like an os.File
.
Other info:
This is not directly applicable to golang, but you may find the following thread interesting: Can read(2) return zero bytes when not at EOF. Its topic is the read() system call's semantics (POSIX). Reads on non-blocking sockets/files, even when no data is ready, should return -1, not 0, and set errno EAGAIN (or EINTR when interrupted). Non-blocking sockets/files are not really a concept native to go (as far as i know), and the bufio
module in particular will panic()
whenever/if the underlying reader returns negative numbers, so you don't have to worry about it.
add a comment
|
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55388581%2fgolang-bufio-read-or-bufio-readbyte-to-detect-if-file-is-at-eof%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Passing a buffer of length 1 to bufio.Read
, when the reader is backed with an underlying os.File, will indeed return n==0, io.EOF
if the file is at EOF.
The documentation is being a bit imprecise because some of the behavior depends on the underlying reader you pass to the bufio
reader. The code for bufio.Read()
draws a more accurate picture. I'll outline the logic.
bufio.Read
: Only issues a Read
to the underlying reader if all bytes in the internal buffer have been exhausted. So, presumably, if you've already read as many bytes from the buffered reader as the number of bytes in the underlying file, that internal buffer should be exhausted when you make the last call bufio.Read(buf[0:1])
to check for EOF.
When the internal buffer is exhausted, and you ask the bufio
reader for more, bufio.Read
will do at most one call to the underlying reader. The type of error you get then will depend on your underlying reader.
Asking to read for n > 0
bytes from an os.File
when the read pointer is already at EOF should return 0, io.EOF
(according to the doc on os.File File.Read
). But if your underlying reader was something else, perhaps a custom type specific to your application designed to return 0, nil
at EOF, then bufio.Read
would echo that back instead.
bufio.ReadByte
: The logic behind bufio.ReadByte
is slightly different but the outcome should be the same as bufio.Read
in cases where the underlying reader is an os.File
. The main difference with bufio.Read
is that bufio.ReadByte
can make several attempts to refill the internal buffer. If an error is encountered during refilling (which will be the case for a os.File
reader at EOF), it is returned after the first erroneous read attempt. So, if your underlying Reader is an os.File
reader, then you'll get 0, io.EOF
if and only if your underlying file is at EOF. If your underlying reader was a custom reader type that only returned 0, nil
at EOF, then bufio.ReadByte
would eventually emit a "NoProgress" error. I'm not sure why the retry logic is only in bufio.ReadByte
, but the good news is that either option can be used if your underlying file behaves like an os.File
.
Other info:
This is not directly applicable to golang, but you may find the following thread interesting: Can read(2) return zero bytes when not at EOF. Its topic is the read() system call's semantics (POSIX). Reads on non-blocking sockets/files, even when no data is ready, should return -1, not 0, and set errno EAGAIN (or EINTR when interrupted). Non-blocking sockets/files are not really a concept native to go (as far as i know), and the bufio
module in particular will panic()
whenever/if the underlying reader returns negative numbers, so you don't have to worry about it.
add a comment
|
Passing a buffer of length 1 to bufio.Read
, when the reader is backed with an underlying os.File, will indeed return n==0, io.EOF
if the file is at EOF.
The documentation is being a bit imprecise because some of the behavior depends on the underlying reader you pass to the bufio
reader. The code for bufio.Read()
draws a more accurate picture. I'll outline the logic.
bufio.Read
: Only issues a Read
to the underlying reader if all bytes in the internal buffer have been exhausted. So, presumably, if you've already read as many bytes from the buffered reader as the number of bytes in the underlying file, that internal buffer should be exhausted when you make the last call bufio.Read(buf[0:1])
to check for EOF.
When the internal buffer is exhausted, and you ask the bufio
reader for more, bufio.Read
will do at most one call to the underlying reader. The type of error you get then will depend on your underlying reader.
Asking to read for n > 0
bytes from an os.File
when the read pointer is already at EOF should return 0, io.EOF
(according to the doc on os.File File.Read
). But if your underlying reader was something else, perhaps a custom type specific to your application designed to return 0, nil
at EOF, then bufio.Read
would echo that back instead.
bufio.ReadByte
: The logic behind bufio.ReadByte
is slightly different but the outcome should be the same as bufio.Read
in cases where the underlying reader is an os.File
. The main difference with bufio.Read
is that bufio.ReadByte
can make several attempts to refill the internal buffer. If an error is encountered during refilling (which will be the case for a os.File
reader at EOF), it is returned after the first erroneous read attempt. So, if your underlying Reader is an os.File
reader, then you'll get 0, io.EOF
if and only if your underlying file is at EOF. If your underlying reader was a custom reader type that only returned 0, nil
at EOF, then bufio.ReadByte
would eventually emit a "NoProgress" error. I'm not sure why the retry logic is only in bufio.ReadByte
, but the good news is that either option can be used if your underlying file behaves like an os.File
.
Other info:
This is not directly applicable to golang, but you may find the following thread interesting: Can read(2) return zero bytes when not at EOF. Its topic is the read() system call's semantics (POSIX). Reads on non-blocking sockets/files, even when no data is ready, should return -1, not 0, and set errno EAGAIN (or EINTR when interrupted). Non-blocking sockets/files are not really a concept native to go (as far as i know), and the bufio
module in particular will panic()
whenever/if the underlying reader returns negative numbers, so you don't have to worry about it.
add a comment
|
Passing a buffer of length 1 to bufio.Read
, when the reader is backed with an underlying os.File, will indeed return n==0, io.EOF
if the file is at EOF.
The documentation is being a bit imprecise because some of the behavior depends on the underlying reader you pass to the bufio
reader. The code for bufio.Read()
draws a more accurate picture. I'll outline the logic.
bufio.Read
: Only issues a Read
to the underlying reader if all bytes in the internal buffer have been exhausted. So, presumably, if you've already read as many bytes from the buffered reader as the number of bytes in the underlying file, that internal buffer should be exhausted when you make the last call bufio.Read(buf[0:1])
to check for EOF.
When the internal buffer is exhausted, and you ask the bufio
reader for more, bufio.Read
will do at most one call to the underlying reader. The type of error you get then will depend on your underlying reader.
Asking to read for n > 0
bytes from an os.File
when the read pointer is already at EOF should return 0, io.EOF
(according to the doc on os.File File.Read
). But if your underlying reader was something else, perhaps a custom type specific to your application designed to return 0, nil
at EOF, then bufio.Read
would echo that back instead.
bufio.ReadByte
: The logic behind bufio.ReadByte
is slightly different but the outcome should be the same as bufio.Read
in cases where the underlying reader is an os.File
. The main difference with bufio.Read
is that bufio.ReadByte
can make several attempts to refill the internal buffer. If an error is encountered during refilling (which will be the case for a os.File
reader at EOF), it is returned after the first erroneous read attempt. So, if your underlying Reader is an os.File
reader, then you'll get 0, io.EOF
if and only if your underlying file is at EOF. If your underlying reader was a custom reader type that only returned 0, nil
at EOF, then bufio.ReadByte
would eventually emit a "NoProgress" error. I'm not sure why the retry logic is only in bufio.ReadByte
, but the good news is that either option can be used if your underlying file behaves like an os.File
.
Other info:
This is not directly applicable to golang, but you may find the following thread interesting: Can read(2) return zero bytes when not at EOF. Its topic is the read() system call's semantics (POSIX). Reads on non-blocking sockets/files, even when no data is ready, should return -1, not 0, and set errno EAGAIN (or EINTR when interrupted). Non-blocking sockets/files are not really a concept native to go (as far as i know), and the bufio
module in particular will panic()
whenever/if the underlying reader returns negative numbers, so you don't have to worry about it.
Passing a buffer of length 1 to bufio.Read
, when the reader is backed with an underlying os.File, will indeed return n==0, io.EOF
if the file is at EOF.
The documentation is being a bit imprecise because some of the behavior depends on the underlying reader you pass to the bufio
reader. The code for bufio.Read()
draws a more accurate picture. I'll outline the logic.
bufio.Read
: Only issues a Read
to the underlying reader if all bytes in the internal buffer have been exhausted. So, presumably, if you've already read as many bytes from the buffered reader as the number of bytes in the underlying file, that internal buffer should be exhausted when you make the last call bufio.Read(buf[0:1])
to check for EOF.
When the internal buffer is exhausted, and you ask the bufio
reader for more, bufio.Read
will do at most one call to the underlying reader. The type of error you get then will depend on your underlying reader.
Asking to read for n > 0
bytes from an os.File
when the read pointer is already at EOF should return 0, io.EOF
(according to the doc on os.File File.Read
). But if your underlying reader was something else, perhaps a custom type specific to your application designed to return 0, nil
at EOF, then bufio.Read
would echo that back instead.
bufio.ReadByte
: The logic behind bufio.ReadByte
is slightly different but the outcome should be the same as bufio.Read
in cases where the underlying reader is an os.File
. The main difference with bufio.Read
is that bufio.ReadByte
can make several attempts to refill the internal buffer. If an error is encountered during refilling (which will be the case for a os.File
reader at EOF), it is returned after the first erroneous read attempt. So, if your underlying Reader is an os.File
reader, then you'll get 0, io.EOF
if and only if your underlying file is at EOF. If your underlying reader was a custom reader type that only returned 0, nil
at EOF, then bufio.ReadByte
would eventually emit a "NoProgress" error. I'm not sure why the retry logic is only in bufio.ReadByte
, but the good news is that either option can be used if your underlying file behaves like an os.File
.
Other info:
This is not directly applicable to golang, but you may find the following thread interesting: Can read(2) return zero bytes when not at EOF. Its topic is the read() system call's semantics (POSIX). Reads on non-blocking sockets/files, even when no data is ready, should return -1, not 0, and set errno EAGAIN (or EINTR when interrupted). Non-blocking sockets/files are not really a concept native to go (as far as i know), and the bufio
module in particular will panic()
whenever/if the underlying reader returns negative numbers, so you don't have to worry about it.
edited Mar 28 at 18:07
answered Mar 28 at 0:47
init_jsinit_js
1,38210 silver badges28 bronze badges
1,38210 silver badges28 bronze badges
add a comment
|
add a comment
|
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55388581%2fgolang-bufio-read-or-bufio-readbyte-to-detect-if-file-is-at-eof%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown