Запись строки в файл вызывает исключение в C#

Я получаю сообщение об ошибке «FormatException: входная строка имеет неправильный формат», которую я не понимаю.

Я использую следующие строки для записи строки в текстовый файл:

using (StreamWriter sw = new StreamWriter(myfilename, false, System.Text.Encoding.GetEncoding(enc)))
{
    sw.Write(mystring, Environment.NewLine);
}

(часть кодирования связана с тем, что в моем приложении есть возможность установить его на utf-8 или iso-8859-1... но я думаю, что это не имеет значения).

Все мои строки записываются просто отлично, за исключением одной строки, которая отличается от других, потому что на самом деле в ней есть фрагмент кода javascript. Я уверен, что проблема может быть вызвана одним из специальных символов, но откуда мне знать?

Единственное, что я пробовал, это вставить следующую строку непосредственно перед оператором sw.Write выше:

System.Console.WriteLine(mystring);

и в консоль все нормально записало - без ошибок.

Помощь?

Спасибо! (и с Новым годом!)

-Адина


person adeena    schedule 01.01.2009    source источник


Ответы (2)


Используемая вами перегрузка принимает формат в качестве первого параметра, а затем объекты для внедрения.

Вы можете сделать одно из следующих действий:

sw.Write(mystring + Environment.NewLine);

or

sw.Write("{0}{1}", mystring, Environment.NewLine);
person Øyvind Skaar    schedule 01.01.2009
comment
Оба примера выше будут работать; так будет sw.WriteLine(mystring). Однако, если не ясно, почему произошла ошибка, проблема еще не решена, просто ее избегают ;) - person DK.; 02.01.2009
comment
Ну и еще одна мелочь — конкатенация строк — дурная привычка. - person DK.; 02.01.2009

В ответ на комментарии от DK я проверил, какая конкатенация расширенных строк выполняется медленнее. Я сделал эту настройку с тремя вариантами;

  • объединение строки
  • звоню sw.Write дважды
  • звоню sw.WriteLine

На моей машине второй вариант примерно на 88% быстрее среднего. При 10000000 итерациях они используют 3517, 2420 и 3385 миллисекунд.

Это должно иметь значение только в том случае, если это код, который вызывается в вашей программе много раз.

using System;
using System.IO;
using System.Text;

class Program
    {
        static void Main(string[] args)
        {
            const string myString = "kdhlkhldhcøehdhkjehdkhekdhk";
            int iterations=getIntFromParams(args, 0, 10);
            int method = getIntFromParams(args, 1, 0);
            var fileName=Path.GetTempFileName();
            using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.Default))
            {
                switch (method)
                {
                    case 0:

                        Console.WriteLine("Starting method with concatenation. Iterations: " + iterations);
                        var start0 = DateTimeOffset.Now;
                        for (int i = 0; i < iterations; i++)
                        {
                            sw.Write(myString + Environment.NewLine);
                        }
                        var time0 = DateTimeOffset.Now - start0;
                        Console.WriteLine("End at " + time0.TotalMilliseconds + " ms.");

                        break;
                    case 1:
                        Console.WriteLine("Starting method without concatenation. Iterations: " + iterations);
                        var start1 = DateTimeOffset.Now;
                        for (int i = 0; i < iterations; i++)
                        {
                            sw.Write(myString);
                            sw.Write(Environment.NewLine);
                        }
                        var time1 = DateTimeOffset.Now - start1;
                        Console.WriteLine("End at " + time1.TotalMilliseconds + " ms.");
                        break;
                    case 2:
                        Console.WriteLine("Starting method without concatenation, using WriteLine. Iterations: " + iterations);
                        var start2 = DateTimeOffset.Now;
                        for (int i = 0; i < iterations; i++)
                        {
                            sw.WriteLine(myString);
                        }
                        var time2 = DateTimeOffset.Now - start2;
                        Console.WriteLine("End at " + time2.TotalMilliseconds + " ms.");
                        break;
                }
            }
        }

        private static int getIntFromParams(string[] args, int index, int @default)
        {
            int value;
            try
            {
                if (!int.TryParse(args[index], out value))
                {
                    value = @default;
                }
            }
            catch(IndexOutOfRangeException)
            {
                value = @default;
            }
            return value;
        }
  }
person Øyvind Skaar    schedule 03.01.2009