我怎么知道我什么时候';在C#中使用ReadBlock方法时,已到达文件末尾?
我注意到它会一次又一次地返回相同的读取字符,但我想知道是否有更优雅的方法。检查。当此值为我怎么知道我什么时候';在C#中使用ReadBlock方法时,已到达文件末尾?,c#,streamreader,readblock,C#,Streamreader,Readblock,我注意到它会一次又一次地返回相同的读取字符,但我想知道是否有更优雅的方法。检查。当此值为真时,停止读取循环 确保您的代码正确处理ReadBlock调用上“byte count just read”的返回值。听起来您看到的是零字节读取,只是假设您看到的未更改的缓冲区内容是对相同数据的另一次读取。From forReadBlock(): while(!streamReader.EndOfStream) { string line = streamReader.ReadLine();
真时,停止读取循环
确保您的代码正确处理ReadBlock
调用上“byte count just read”的返回值。听起来您看到的是零字节读取,只是假设您看到的未更改的缓冲区内容是对相同数据的另一次读取。From forReadBlock()
:
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
返回值类型:System.Int32
底层流的位置是
按字符数前进
它们被读入缓冲区。号码
已读取的字符数。这个
数字将小于或等于
计数,取决于是否所有输入
字符已被读取
所以我假设当它返回0时是EOF,当返回的读取长度小于您请求的读取长度时,您就到了末尾。您还应该跟踪读取长度,以防流大小与缓冲区大小不匹配,因此需要考虑缓冲区中较短的数据长度
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(len == buffer.Length);
您还可以在循环条件中检查流的EndOfStream
标志。我更喜欢这种方法,因为您不会进行长度为“0”的读取(罕见的情况,但可能会发生)
不幸的是,我还不能对答案发表评论,但对“Moof”的答案
在此处使用cur
是错误的,因为index
参数用于buffer
中要开始写入的索引。因此,对于您的示例,对于网络流
(来自TcpClient.GetStream
),在调用stream.ReadBlock时,它应该替换为下面的0
,如果远程端首先终止,访问EndOfStream
会给我一个IOException
:无法从传输连接读取数据:现有连接被远程主机强制关闭。-->System.Net.Sockets.SocketException:现有连接被远程主机强制关闭
这是一个坏例子。ReadLine将阻塞,直到到达新行字符。这是一个错误的假设,您的数据将有一个新行字符。您的流缓冲区将被填满,而您的应用程序将挂起,等待该缓冲区被读取。@Dan您建议使用什么解决方案来代替ReadLine?
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(!stream.EndOfStream);