Я получаю непонятную ошибку «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);
и он отлично выписал на консоль - без ошибок.
Помощь?
Спасибо! (и с Новым годом!)
-Адина





Используемая вами перегрузка принимает формат в качестве первого параметра, а затем объекты, которые необходимо добавить.
Вы можете сделать одно из следующих действий:
sw.Write(mystring + Environment.NewLine);
или же
sw.Write("{0}{1}", mystring, Environment.NewLine);
Ах, и еще одна мелочь - конкатенация строк - плохая привычка.
В ответ на комментарии 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;
}
}
Оба приведенных выше примера будут работать; так будет sw.WriteLine (mystring). Однако, если не ясно, «почему» произошла ошибка, проблема еще не решена, ее просто удалось избежать;)