When reading two dates from a binary file I’m seeing the error below:
“The output char buffer is too small to contain the decoded characters, encoding ‘Unicode (UTF-8)’ fallback ‘System.Text.DecoderReplacementFallback’. Parameter name: chars”
My code is below:
static DateTime[] ReadDates()
{
System.IO.FileStream appData = new System.IO.FileStream(
appDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read);
List<DateTime> result = new List<DateTime>();
using (System.IO.BinaryReader br = new System.IO.BinaryReader(appData))
{
while (br.PeekChar() > 0)
{
result.Add(new DateTime(br.ReadInt64()));
}
br.Close();
}
return result.ToArray();
}
static void WriteDates(IEnumerable<DateTime> dates)
{
System.IO.FileStream appData = new System.IO.FileStream(
appDataFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
List<DateTime> result = new List<DateTime>();
using (System.IO.BinaryWriter bw = new System.IO.BinaryWriter(appData))
{
foreach (DateTime date in dates)
bw.Write(date.Ticks);
bw.Close();
}
}
What could be the cause? Thanks
The problem is that you’re using
PeekChar– that’s trying to decode binary data as if it were a UTF-8 character. Unfortunately, I can’t see anything else inBinaryReaderwhich allows you to detect the end of the stream.You could just keep calling
ReadInt64until it throws anEndOfStreamException, but that’s pretty horrible. Hmm. You could callReadBytes(8)and thenBitConverter.ToInt64– that would allow you to stop whenReadBytesreturns a byte array with anything less than 8 bytes… it’s not great though.By the way, you don’t need to call
Closeexplicitly as you’re already using ausingstatement. (That goes for both the reader and the writer.)