Двоичное чтение байтов, возвращающее только одно значение. С#

Консоль отображает 0,0,0,0, когда я ожидаю 0,1,2,3.

Это модифицированная версия: https://msdn.microsoft.com/en-us/library/system.io.binarywriter(v=vs.110).aspx

using System;
using System.IO;

namespace testingfilereadwrite
{    
class Program
{
    const string FileName = "TestFile.dat";       
static void Main()
    {
        WriteDefaultValues();
        DisplayValues();
        Console.ReadKey();
    }        
public static void WriteDefaultValues()
    {
        using (BinaryWriter writer = new BinaryWriter(File.Open(FileName, FileMode.Create)))
        {
            writer.Write(0);
            writer.Write(1);
            writer.Write(2);
            writer.Write(3);
        }
    }

    public static void DisplayValues()
    {
        byte byte1;
        byte byte2;
        byte byte3;
        byte byte4;

        if (File.Exists(FileName))
        {
            using (BinaryReader reader = new BinaryReader(File.Open(FileName, FileMode.Open)))
            {
                byte1 = reader.ReadByte();
                byte2 = reader.ReadByte();
                byte3 = reader.ReadByte();
                byte4 = reader.ReadByte();
            }

            Console.WriteLine(byte1);
            Console.WriteLine(byte2);
            Console.WriteLine(byte3);
            Console.WriteLine(byte4);
        }
    }
}`

Почему он показывает только 0? Как я могу заставить его отображать то, что мне нужно? Кроме того, почему это работает, когда я использую что-то отличное от байта, например строку или целое число.


person UpTide    schedule 20.04.2015    source источник


Ответы (2)


Потому что вы записываете в файл целые числа, а первые 4 байта равны 0.

    public static void WriteDefaultValues()
    {
        using (BinaryWriter writer = new BinaryWriter(File.Open(FileName, FileMode.Create)))
        {
            writer.Write((byte)0);
            writer.Write((byte)1);
            writer.Write((byte)2);
            writer.Write((byte)3);
        }
    }

Попробуй это.

person Ron Beyer    schedule 20.04.2015
comment
Спасибо, ваше решение работает, но Shar1er80 рассказал мне, почему оно вообще не работает. - person UpTide; 20.04.2015
comment
Он объяснил это лучше, но я также говорю, почему (над кодом). .Write — это перегрузка, а числовой тип по умолчанию в .NET — целое число (если оно не имеет десятичной точки, то это двойное число). Каждая запись в вашем исходном коде записывала 4 байта, поэтому вместо 4-байтового файла у вас был 16-байтовый. Если вы столкнетесь с этими проблемами в будущем, попробуйте открыть файл в шестнадцатеричном редакторе. - person Ron Beyer; 20.04.2015

Когда вы записываете в свой файл данных:

    public static void WriteDefaultValues()
    {
        using (BinaryWriter writer = new BinaryWriter(File.Open(FileName, FileMode.Create)))
        {
            writer.Write(0);
            writer.Write(1);
            writer.Write(2);
            writer.Write(3);
        }
    }

На самом деле вы записываете целое число (4 байта) в свой файл.

Итак, когда вы читаете, вы читаете первые 4 байта вашего файла, которые являются вашим нулем, который вы написали (0x00, 0x00, 0x00, 0x00). В своем методе записи приведите свои значения к байту, и вы получите ожидаемые результаты.

    public static void WriteDefaultValues()
    {
        using (BinaryWriter writer = new BinaryWriter(File.Open(FileName, FileMode.Create)))
        {
            writer.Write((byte)0);
            writer.Write((byte)1);
            writer.Write((byte)2);
            writer.Write((byte)3);
        }
    }
person Shar1er80    schedule 20.04.2015
comment
Ооо. Спасибо большое. Мне предстоит многое узнать о способах чтения/записи файлов и типах данных. - person UpTide; 20.04.2015