title: How to remove all instances of a character from a file in C#?
body: <p>I am processing XML files from a third party.  These files occasionally have invalid characters in them which causes <code>XMLTextReader.Read()</code> to throw an exception.</p>
  
  <p>I am currently handling this with the following function:</p>
  
  <pre><code>XmlTextReader GetCharSafeXMLTextReader(string fileName)
  {
      try
      {
          MemoryStream ms = new MemoryStream();
          StreamReader sr = new StreamReader(fileName);
          StreamWriter sw = new StreamWriter(ms);
          string temp;
          while ((temp = sr.ReadLine()) != null)
              sw.WriteLine(temp.Replace(((char)4).ToString(), "").Replace(((char)0x14).ToString(), ""));
  
          sw.Flush();
          sr.Close();
          ms.Seek(0, SeekOrigin.Begin);
          return new XmlTextReader(ms);
      }
      catch (Exception exp)
      {
          throw new Exception("Error parsing file: " + fileName + " " + exp.Message, exp.InnerException);
      }
  }
  </code></pre>
  
  <p>My gut is saying there should be a better/faster way to do this. (And yes, getting the third party to fix their XMLs would be great, but it's not happening at this point.)</p>
  
  <p>EDIT:  Here is the final solution, based on cfeduke's answer:</p>
  
  <pre><code>
      public class SanitizedStreamReader : StreamReader
      {
          public SanitizedStreamReader(string filename) : base(filename) { }
          /* other ctors as needed */
          // this is the only one that XmlTextReader appears to use but
          // it is unclear from the documentation which methods call each other
          // so best bet is to override all of the Read* methods and Peek
          public override string ReadLine()
          {
              return Sanitize(base.ReadLine());
          }
  
          public override int Read()
          {
              int temp = base.Read();
              while (temp == 0x4 || temp == 0x14)
                  temp = base.Read();
              return temp;
          }
  
          public override int Peek()
          {
              int temp = base.Peek();
              while (temp == 0x4 || temp == 0x14)
              {
                  temp = base.Read();
                  temp = base.Peek();
              }
              return temp;
          }
  
          public override int Read(char[] buffer, int index, int count)
          {
              int temp = base.Read(buffer, index, count);
              for (int x = index; x &lt; buffer.Length; x++)
              {
                  if (buffer[x] == 0x4 || buffer[x] == 0x14)
                  {
                      for (int a = x; a &lt; buffer.Length - 1; a++)
                          buffer[a] = buffer[a + 1];
                      temp--; //decrement the number of characters read
                  }  
              }
              return temp;
          }
  
          private static string Sanitize(string unclean)
          {
              if (unclean == null)
                  return null;
              if (String.IsNullOrEmpty(unclean))
                  return "";
              return unclean.Replace(((char)4).ToString(), "").Replace(((char)0x14).ToString(), "");
          }
      }
  </code></pre>