StreamReader.Read returns

本文关键字:returns Read StreamReader | 更新日期: 2023-09-27 18:07:58

我是一个编码新手。我试图一次从文件中读取几个字符,我的代码如下所示。但是,当文件的字符少于请求的字符时,它将'0返回到数组中,'0是什么意思呢?请帮我理解。

using (StreamReader sr = new StreamReader(m_segmentFile.TempFileName))
using (StreamWriter sw = new StreamWriter(m_segmentFile.DisplayFile))
{
    while ( sr.Peek() >= 0 || m_segmentFile.ParserStatus == ParserStatus.Stopped)
    {
        buffer = new char[m_segmentFile.FieldWidth];
        sr.Read(buffer, 0, buffer.Length);
        block = new string(buffer);
        if (block[0] != '%')
        {
            noerrors = m_segmentFile.CheckBlockValidity(block) && noerrors;
            int percentComplete = (int)Math.Round((double)(offset * 100) / sr.BaseStream.Length);
            if (percentComplete > m_percentParsed && percentComplete <= 100)
            {
                m_percentParsed = (int)percentComplete;
                m_segmentFile.PercentParsed = m_percentParsed;
            }
            block = (m_segmentFile.FieldWidth * index).ToString() + ":" +block;
            sw.WriteLine(block);
            index++;
            m_parserStatus = ParserStatus.Parsing;
        }
        else
        {
            sw.WriteLine(block);
            //sr.BaseStream.Seek();
        }
    }

StreamReader.Read returns �

0表示文件结束

摘自StreamReader.Read Method (Char[], Int32, Int32)文档:


返回值类型:系统。Int32
已读取的字符数,如果在流的末尾没有读取数据,则为0。该数字将小于或等于count参数,具体取决于该数据是否在流中可用。

从文件中读取字符的更正确的方法是仅使用刚刚使用String Constructor (Char[], Int32, Int32)从文件中读取的字符。这将从字符串中删除额外的0字符,并且还可以防止您从以前的读取中重新读取buffer中的字符。

int readLength = sr.Read(buffer, 0, buffer.Length);
block = new string(buffer, 0, readLength);

一个更好的选择可能是使用StringReader来包装你的StreamReader

'0是字符串终止控制字符。
它表示字符串的结束-或者在您的情况下-文件的结束。

因为它看起来像你正在解析一个固定宽度的文件结构,很可能你会有段对齐问题。如果每个块都应该是m_segmentFile.FieldWidth长度,则每次都需要继续读取,直到填满缓冲区。

using (StreamReader sr = new StreamReader(m_segmentFile.TempFileName))
using (StreamWriter sw = new StreamWriter(m_segmentFile.DisplayFile))
{
    //I bet money you meant to use && with != stopped not || with == stopped.
    while ( sr.Peek() >= 0 && m_segmentFile.ParserStatus != ParserStatus.Stopped)
    {
        buffer = new char[m_segmentFile.FieldWidth];
        int offset = 0;
        //Keeps reading till the buffer is totally full;
        while(offset < m_segmentFile.FieldWidth && sr.Peek() >= 0 && m_segmentFile.ParserStatus != ParserStatus.Stopped)
        {
            offset += sr.Read(buffer, offset, buffer.Length - offset);
        }

        //Reads in to the offset we got to, in case we ended early due to the stream ending or being signaled to stop.
        block = new string(buffer, 0, offset);
        if (block[0] != '%')
        {
            noerrors = m_segmentFile.CheckBlockValidity(block) && noerrors;
            int percentComplete = (int)Math.Round((double)(offset * 100) / sr.BaseStream.Length);
            if (percentComplete > m_percentParsed && percentComplete <= 100)
            {
                m_percentParsed = (int)percentComplete;
                m_segmentFile.PercentParsed = m_percentParsed;
            }
            block = (m_segmentFile.FieldWidth * index).ToString() + ":" +block;
            sw.WriteLine(block);
            index++;
            m_parserStatus = ParserStatus.Parsing;
        }
        else
        {
            sw.WriteLine(block);
            //sr.BaseStream.Seek();
        }
    }