Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎么知道我什么时候';在C#中使用ReadBlock方法时,已到达文件末尾?_C#_Streamreader_Readblock - Fatal编程技术网

我怎么知道我什么时候';在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 for
ReadBlock()

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);