C# StreamReader.EndOfStream缺少最后一行?

C# StreamReader.EndOfStream缺少最后一行?,c#,.net,file-io,stream,C#,.net,File Io,Stream,我试图使用代码(粘贴在下面)读取文本文件,但文件的最后一行无法读取。我的逻辑正确吗 using (StreamReader reader = new StreamReader(stream)) { try { string line = reader.ReadLine(); string[] data = BreakLine(line);

我试图使用代码(粘贴在下面)读取文本文件,但文件的最后一行无法读取。我的逻辑正确吗

        using (StreamReader reader = new StreamReader(stream))
        {
            try
            {
                string line = reader.ReadLine();
                string[] data = BreakLine(line);  


                while (!reader.EndOfStream)
                {
                    data = BreakLine(line);
                    DataRow dr = _DataTable.NewRow();
                    // protect against overflow
                    int maxColumns = Math.Min(_DataTable.Columns.Count, data.Length);
                    for (int i = 0; i < maxColumns; i++)
                    {
                        dr[i] = data[i];
                    }
                    _DataTable.Rows.Add(dr);
                    line = reader.ReadLine();
                }
                return _DataTable;
            }
            finally
            {
                reader.Close();
                reader.Dispose();
                stream.Close();
            }
        }
使用(StreamReader=新的StreamReader(stream))
{
尝试
{
字符串行=reader.ReadLine();
字符串[]数据=特征线(线);
而(!reader.EndOfStream)
{
数据=特征线(直线);
DataRow dr=_DataTable.NewRow();
//防止溢出
int maxColumns=Math.Min(_DataTable.Columns.Count,data.Length);
对于(int i=0;i
问题是:因为您有:

line = reader.ReadLine();
作为
while
循环的最后一行,它将读取最后一行,然后丢弃它,因为
while
条件将返回false

我想你需要这个:

try
{
    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        string[] data = BreakLine(line);  
        DataRow dr = _DataTable.NewRow();
        // protect against overflow
        int maxColumns = Math.Min(_DataTable.Columns.Count, data.Length);
        for (int i = 0; i < maxColumns; i++)
        {
            dr[i] = data[i];
        }
        _DataTable.Rows.Add(dr);
    }
    return _DataTable;
}
finally
{
    ...
试试看
{
而(!reader.EndOfStream)
{
字符串行=reader.ReadLine();
字符串[]数据=特征线(线);
DataRow dr=_DataTable.NewRow();
//防止溢出
int maxColumns=Math.Min(_DataTable.Columns.Count,data.Length);
对于(int i=0;i

因此,您只需将每一行作为每次循环的第一件事来阅读即可。

一个快速提示-您不需要在最后一块中使用此提示:

finally
{
   reader.Close();
   reader.Dispose();

由于“reader”有一个Using块,即使出现异常,它也会自动为您处理。

另一个选项是使用do while循环,并对reader.Peek()进行while条件检查!=-1我同意突破,只要使用脚控制的循环,事情就会顺利进行。遗憾的是,今天的大多数程序员并不关心何时使用哪种循环。@突破,@BeowulfOF:当给定一个空文件时,while循环将如何工作?@breakdown您能演示Peek()吗?