文件流在读取时预先添加垃圾字符

时间:2010-11-13 10:09:41

标签: c# filestream

我正在阅读一个简单的文本文件,其中包含使用filestream类的单行。但似乎filestream.read在开头就预设了一些垃圾角色。

代码下方。

using (var _fs = File.Open(_idFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
     byte[] b = new byte[_fs.Length];
     UTF8Encoding temp = new UTF8Encoding(true);
     while (_fs.Read(b, 0, b.Length) > 0)
     {
         Console.WriteLine(temp.GetString(b));
         Console.WriteLine(ASCIIEncoding.ASCII.GetString(b));


     }
 }

例如:我在文本文件中的数据只是“样本”。但上面的代码返回

  "?sample" and
  "???sample"

原因是什么?它是文件指示器的开头吗?有没有办法只读我的实际内容??

4 个答案:

答案 0 :(得分:2)

可能是BOM - a.k.a字节顺序标记。

答案 1 :(得分:2)

byte order mark(BOM)由Unicode字符0xFEFF组成,用于标记文件使用的编码。

因此,如果您正确地将文件解码为UTF8,则会将该字符作为字符串的第一个字符。如果您将其错误地解码为ANSI,则会得到3个字符,因为0xFEFF的UTF8编码是字节序列“EF BB BF”,即3个字节。

但您的整个代码可以替换为

File.ReadAllText(fileName,Encoding.UTF8)

那也应该删除BOM。或者您省略编码参数并让函数自动检测编码(它使用BOM)

答案 2 :(得分:0)

您正在从流中读取BOM。如果您正在阅读文本,请尝试使用StreamReader来自动处理此问题。

答案 3 :(得分:0)

尝试改为

using (StreamReader sr = new StreamReader(File.Open(path),Encoding.UTF8))

它肯定会剥夺你的物料清单