1

このファイルがあり、UTF-8 エンコーディングを使用しており、読み取ろうとしています。これまで、BinaryReader、FileStream を使用してきましたが、File.ReadAllLines を試しました。これまでのところ、ファイルの最初の行しか取得していません。

これまでに試したもののいくつかのサンプルを次に示します。

public partial class Form1 : Form
    {
        private string filename = @"C:\UNICORN\Server\Fil\Users30.mpm";
        public Form1()
        {
            InitializeComponent();
        }

        private static void clearText(RichTextBox rtb)
        {
            rtb.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // use a binary reader
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            using(BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
            {
                int pos = 0;
                int length = (int) br.BaseStream.Length;    // length of the file
                byte[] bytes = new byte[length];

                for(int i = 0; i < length; i++)
                {
                    bytes[i] = br.ReadByte();
                }
                sb.Append("File Size: " + bytes.Length + "\n");
                sb.AppendLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes));
            }

            richTextBox1.Text = sb.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // use a binary reader
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            using(BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
            {
                int pos = 0;
                int length = (int) br.BaseStream.Length;

                sb.Append("File Size: " + length + "\n");
                while (pos < length)
                {
                    var v = br.ReadInt32();
                    sb.Append((char)v + "\n");
                    pos += sizeof (int);
                }

                richTextBox1.Text = sb.ToString();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // use a binary reader
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
            {
                int pos = 0;
                int length = (int)br.BaseStream.Length;    // length of the file
                byte[] bytes = new byte[length];

                sb.Append("File Size: " + bytes.Length + "\n");
                for (int i = 0; i < length; i++)
                {
                    var b = br.ReadByte();
                    sb.Append("Byte: " + b + " - " + (char) b + "\n");
                }

                //sb.AppendLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes));
            }

            richTextBox1.Text = sb.ToString();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            // use a stream reader
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            using(StreamReader sr = new StreamReader(filename, Encoding.UTF8))
            {
                sb.Append(sr.ReadLine() + "\n");
            }

            richTextBox1.Text = sb.ToString();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            // use a stream reader
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            using (StreamReader reader = new StreamReader(File.OpenRead(filename)))
            {
                while(!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if(line != null)
                    {
                        sb.AppendLine(line);
                    }
                }
            }

            richTextBox1.Text = sb.ToString();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            // use a file stream and a decoder
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();
            byte[] byData = new byte[255];
            char[] charData = new char[255];
            try
            {
                FileStream aFile = new FileStream(filename, FileMode.Open);
                aFile.Seek(55, SeekOrigin.Begin);
                aFile.Read(byData, 0, 100);
            } catch (Exception ex)
            {
                sb.Append("ERROR: " + ex.ToString());
            }

            Decoder d = Encoding.UTF8.GetDecoder();
            d.GetChars(byData, 0, byData.Length, charData, 0);

            foreach(char c in charData)
            {
                sb.Append(c + " ");
            }

            richTextBox1.Text = sb.ToString();
        }

        private void button7_Click(object sender, EventArgs e)
        {
            // find the encoding of a file, just trying to find out the encoding with this
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            using(var r = new StreamReader(filename, detectEncodingFromByteOrderMarks: true))
            {
                var es = r.CurrentEncoding;
                sb.Append("Encoding: " + es);
            }

            richTextBox1.Text = sb.ToString();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            // use File.ReadAllLines()
            clearText(richTextBox1);
            StringBuilder sb = new StringBuilder();

            foreach(var line in File.ReadAllLines(filename, Encoding.UTF8))
            {
                sb.Append(line.ToString() + "\n");
            }

            richTextBox1.Text = sb.ToString();
        }
    }

これらの例はすべて、ファイルの 1 行だけを示しています。ファイル全体をどのように読み取り/解析しますか?

ファイルにはユーザーのリストが含まれており、最終的にファイルを読み取ってそれらのユーザー名を見つけようとしています。現在、ファイルの最初の行である「UNICORN 3.06」のみが表示されています。

4

2 に答える 2

2

テキストだけが必要な場合、ReadAllTextメソッドはファイル全体を utf-8 として読み取ります。

    private void button1_Click(object sender, EventArgs e)
    {
        richTextBox1.Text = File.ReadAllText(filename);
    }

ファイルの長さに関する情報も必要な場合は、ファイルをバイト単位で読み取り、utf-8 としてデコードします。

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] data = File.ReadAllBytes(filename);
        richTextBox1.Text = "File size: " + data.Length + "\r\n" + Encoding.UTF8.GetString(data);
    }
于 2013-11-15T20:34:33.640 に答える
1

ReadByte はコンストラクターに len の位置が必要だと思いますが、次のようになります。

byte[] fileBytes = File.ReadAllBytes(inputFilename);
StringBuilder sb = new StringBuilder();

foreach(byte b in fileBytes)
{
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0'));  // adds 8 '0's to left of the string
}

File.WriteAllText(outputFilename, sb.ToString());
于 2013-11-15T20:08:50.810 に答える