Запись строки в файл вызывает исключение в C # - PullRequest
1 голос
/ 01 января 2009

Я получаю сообщение об ошибке «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);

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

Помощь

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

-Adeena

Ответы [ 2 ]

11 голосов
/ 01 января 2009

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

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

sw.Write(mystring + Environment.NewLine);

или

sw.Write("{0}{1}", mystring, Environment.NewLine);
0 голосов
/ 03 января 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;
        }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...