none
問一下BinaryReader的問題.. RRS feed

  • 問題

  • 各位好..
    問個基礎問題=_="
    我想用BinaryReader去讀文字檔..
    當然雖然可以用其他的Stream物件去讀..
    但是我偏偏就是要用BinaryReader去讀..
    問題就是他那個ReadString()是做甚麼用處呢??...
    用了老半天..
    讀出來的結果都不正常..
    已經是照書上給的作法了(許清榮的書..我懷疑他給的範例根本就是錯的..)..
    結果還是錯...!!

    請問各位高人要如何解?..
    public partial class Form1 : Form
        {
            private const string PATH = @"c:\demo.txt";
            
            public Form1()
            {
                InitializeComponent();
            }
    
            private void buttonLoading_Click(object sender, EventArgs e)
            {
                textBoxContent.Text = getContent();
            }
    
            private string getContent() {
                FileStream fileStream=null;
                BinaryReader binaryReader = null;
                string content=null;
              
                try
                {
                    fileStream = new FileStream(PATH, FileMode.Open);
                    binaryReader = new BinaryReader(fileStream);
                    content = binaryReader.ReadString();
                }
                catch (IOException ioex)
                {
                    MessageBox.Show(ioex.StackTrace, "Error");
                }
                finally {
                    binaryReader.Close();
                    fileStream.Close();
                }
                return content;
            }
           
        }
    2009年5月14日 上午 04:04

解答

  • 我說一下我的見解,以下是 MSDN 的說明:

    Reads a string from the current stream. The string is prefixed with the length, encoded as an integer seven bits at a time.

    由上述可以知道,Prefixed with the length 表示要讀的這個字串是要有長度擺在前面的,而且這個長度值是 encoded as an integer seven bits at a time。


    所以我想 ReadString() 裡面的作法應該是:

    1. 先用 int count = Read7BitEncodedInt() 把字串長度讀出來
    2. 接著根據長度來呼叫 char[] content = ReadChars(count) 把字元陣列讀出 (讀的時候會參考 小朱 所提的編碼設定來讀)
    3. 將 char[] 轉成 string 後傳回

    所以如果你要讀的字串不是用上述方法作編碼的話,讀出來的東西就會是錯的;

    因此,一般文字檔的話,用 ReadString() 沒辦法讀的,可以改用 ReadChar() 一個字元一個字元慢慢讀出來。 

    No Geek Here! - A blog about DirectShow, Network, and Windows Programming Techniques
    • 已提議為解答 cmf 2009年5月15日 上午 02:07
    • 已標示為解答 小朱MVP, Moderator 2009年5月18日 上午 01:44
    2009年5月15日 上午 01:43

所有回覆

  • MSDN 上的說明是,以每七個位元編碼為文字,然後讀完,就這樣。

    預設的編碼是 UTF8,如果你想讀繁體中文的文字檔,請改用 Big5 或是 System.Text.Encoding.Default (限繁中版作業系統)。
    小人物一枚。
    2009年5月14日 上午 04:16
    版主
  • 以每七個位元編碼為文字,然後讀完..

    我有看到這說明..
    但不是很懂..
    意思就是一次讀7個位元為一個文字..
    然後不斷重複..
    直到讀取完畢是吧??

    2009年5月14日 上午 04:49
  • 我說一下我的見解,以下是 MSDN 的說明:

    Reads a string from the current stream. The string is prefixed with the length, encoded as an integer seven bits at a time.

    由上述可以知道,Prefixed with the length 表示要讀的這個字串是要有長度擺在前面的,而且這個長度值是 encoded as an integer seven bits at a time。


    所以我想 ReadString() 裡面的作法應該是:

    1. 先用 int count = Read7BitEncodedInt() 把字串長度讀出來
    2. 接著根據長度來呼叫 char[] content = ReadChars(count) 把字元陣列讀出 (讀的時候會參考 小朱 所提的編碼設定來讀)
    3. 將 char[] 轉成 string 後傳回

    所以如果你要讀的字串不是用上述方法作編碼的話,讀出來的東西就會是錯的;

    因此,一般文字檔的話,用 ReadString() 沒辦法讀的,可以改用 ReadChar() 一個字元一個字元慢慢讀出來。 

    No Geek Here! - A blog about DirectShow, Network, and Windows Programming Techniques
    • 已提議為解答 cmf 2009年5月15日 上午 02:07
    • 已標示為解答 小朱MVP, Moderator 2009年5月18日 上午 01:44
    2009年5月15日 上午 01:43
  • 你也可以整個檔案一次讀為 Byte() 後,再使用 Encoding 一口氣轉成 String 。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月15日 上午 02:33
  • BinaryReader 本來就不是給讀字串的人用的,它是給自訂資料結構,並且已經有檔案串流儲存規則的人用的。
    就連 .NET Framework 內建的 StreamReader 和 TextReader,也不是由它衍生的實作體 ...
    小人物一枚。
    2009年5月15日 上午 03:22
    版主
  • 這個方式我會..
    只是我看到ReadString()想說用看看...
    2009年5月18日 上午 12:32
  • 知道了..
    那...
    那本書講的就是錯的囉=.=""
    2009年5月18日 上午 12:34