1

私は C# を学ぼうとしているので、チュートリアルを見て、順を追って説明していますが、チュートリアルで行うプログラムにいくつかの小さなことを追加することも好きです。今回は、ファイル ストリーミングに関する新しいボストン C# チュートリアルを見ていました。バイトと通常のテキストの両方を読み取ることができるテキスト読み取りプログラムを作成したいので、3 つのボタンを作成しました。ファイルダイアログを開いていますが、そのオプションを選択するとバイトリーダーに問題が発生し、ゼロのみが表示されます。

これは私のプログラムがどのように見えるかです私のプログラム

これは私のテキストファイルがどのように見えるかです私のテキストファイル

これは、バイトオプションを選択したときに私の結果がどのように見えるかですここに画像の説明を入力

これは私のコードです

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Media;
using System.IO;

namespace sound
{
    public partial class Form1 : Form
    {
    bool bytebuttonclicked = false;
    bool normalbuttonclicked = false;
    string text1;
    public Form1()
    {
        InitializeComponent();
    }
    SoundPlayer My_JukeBox = new SoundPlayer(@"C:\WINDOWS\Media\tada.wav");

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog OFD = new OpenFileDialog();

        if (OFD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            StreamReader sr = new StreamReader(File.OpenRead(OFD.FileName));
            if (normalbuttonclicked == true && bytebuttonclicked == false)
            {
                textBox1.Text = sr.ReadToEnd();
                sr.Dispose();
            }
            else if (bytebuttonclicked == true && normalbuttonclicked == false)
            {
                text1 = sr.ReadToEnd();
                byte[] Buffer = new byte[text1.Length];
                sr.BaseStream.Read(Buffer, 0, text1.Length);
                foreach (byte MyByte in Buffer)
                    textBox1.Text += MyByte.ToString("X") + " ";
                sr.Dispose();
            }
            else
            {
                MessageBox.Show("choose one button");
            }
        }
        My_JukeBox.Play();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        bytebuttonclicked = true;
        button1.Enabled = true;
    }

    private void button3_Click(object sender, EventArgs e)
    {
        normalbuttonclicked = true;
        button1.Enabled = true;
    }
}
}

プログラムがゼロを表示する理由がわかりません。プログラムの何が問題なのか、どうすれば改善できますか? ありがとうございました。

4

2 に答える 2

1

ssgの回答とvatoのコメントに応えて。

text1ssg は、ファイルの末尾を超えて読み取るのではなく、 aに変換することを意味しByte[]ます。

次の行を置き換えます。

byte[] Buffer = new byte[text1.Length];
sr.BaseStream.Read(Buffer, 0, text1.Length);

これとともに:

byte[] Buffer = Encoding.UTF8.GetBytes(text1);

これにより、 ofを含む callが作成さbyte[]れます。Bufferbyte[]text1

Encoding.UTF8.GetBytes(text1)に変換text1されbyte[]ます。

お役に立てれば!

于 2012-06-03T10:04:39.463 に答える
1

最初ReadToEndの呼び出しはストリームの終わりに到達するため、次のsr.BaseStream.Read呼び出しはファイルの終わりより先に読み取ろうとするため、すべてゼロになります。次のいずれかを実行できます。

  • text1エンコード中のデータの損失を気にしない場合は、再読み取りではなく、既に読み取ったものをバイトに変換します。

また

  • File.OpenReadストリームの (操作の結果)Positionプロパティを設定して、ストリーム (リーダーではない) の位置をリセットします。

また

  • ストリームを再開します。
于 2012-06-03T09:24:25.997 に答える