1

次のような構造体を含むファイルがあります。

public struct index
{
    public string word;         //30 bytes
    public int pos;             //4 bytes
};

単語については、int32が4バイトであることを知っているので、書き込む前に必ず30バイトに拡張し、posをそのまま書き込みます。

ファイルに書き込むコードは次のとおりです。

for (i = 0; i < ind.word.Length; i++)
{
   bword[i] = (byte)idx_array[l].word[i];
}
for (; i < SIZE_WORD; i++) //30
{
   bword[i] = 0;
}
bw_idx.Write(bword, 0, SIZE_WORD);
bw_idx.Write(ind.pos);

コードはコンパイルされ、1 つのことを除いて正常に動作します: int32 は書き込まれません。notepad ++を使用してファイルを確認すると、intがあるべき場所に次のように表示SOH NULL NULL NULL されます。SOHを調べたところ、SOH(見出しの開始)であるはずです:

この文字は、アドレスまたはルーティング情報を含む見出しの開始を示すために使用されます。

私のint32が書いていない理由がわかりますか?

試すコード (ファイルはプロジェクトの bin デバッグ フォルダーに保存されます):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace test_write
{
    class Program
    {
        struct enreg
        {
            public string word;
            public int pos;
        }

        const int SIZE_WORD = 30; //30 bytes
        const int SIZE_POS = 4; //4 bytes

        static byte[] bword = new byte[SIZE_WORD];        
        static byte[] bpos = new byte[SIZE_POS];

        static void Main(string[] args)
        {
            enreg enr = new enreg();

            Console.Write("word : ");
            enr.word = Console.ReadLine();
            Console.Write("\anumber : ");
            enr.pos = int.Parse(Console.ReadLine());

            FileStream fs = File.Open("temp", FileMode.Create, FileAccess.ReadWrite);
            BinaryWriter bw = new BinaryWriter(fs);

            int i = 0;
            for (i = 0; i < enr.word.Length; i++)
            {
                bword[i] = (byte)enr.word[i];
            }
            for (; i < SIZE_WORD; i++)
            {
                bword[i] = 0;
            }
            bpos = BitConverter.GetBytes(enr.pos);

            bw.Write(bword, 0, SIZE_WORD);
            bw.Write(bpos, 0, SIZE_POS);

            fs.Close();

        }
    }
}
4

1 に答える 1

1

BinaryWriterバイナリ形式でエンコードされた結果を書き込みます。テキストを出力したい場合は、StreamWriter. テキストとバイトは直接関係ありません。それらを同一のものとして扱うことはできません。

また、char を byte に変換して書き込まないでください。これが不可能な理由がわからない場合は、文字エンコーディングについて読んでください。これは、すべてのプログラマーが持つ必要がある非常に基本的な知識です。

于 2012-12-08T16:54:46.767 に答える