2009-05-27 3 views
1

Im пытается получить определенные строки из файла и поместить их в другой строке или, может быть, если мы можем поместить его в соседнем текстовом поле оно не будут пробами: PНаполнение TextBox из текстового файла

string[] msglines; 

msglines = System.IO.File.ReadAllLines(@"C:\\Users\xA\Desktop\MESSAGES.txt"); 

for (int x = 0; x < msglines.Length; x++) 
{ 
    this.textBox5.Text = msglines[c]; 
    c = c + 2; 
} 

Я получаю: Индекс находился за пределами массива.

+4

Что это за «c» в цикле и почему вы не используете «x»? Почему вы добавляете 2 в «c»? –

+0

Вероятно, опечатка, но вам не нужна двойная \\ в пути к файлу –

+0

(ответил на комментарий) –

ответ

0

У вас двойная обратная косая черта в вызове ReadAllLines(), что приводит к сбою в открытии файла.

Кроме того, вы используете c как индекс массива, это выглядит, как вы хотите x

+0

Дополнительные косые черты игнорируются (а косые черты выполняются постольку, пока вы используете их последовательно). И он не бросил бы исключение IndexOutOfRangeException. –

+0

Хорошо. Это все еще не решает тот факт, что он неправильно индексирует свой массив. –

+0

@Ruben - это неправда, попробуйте. Однако это вызывает недоумение - если массив msglines был пуст из-за неудачного чтения (хотя я бы ожидал исключения), тогда для не следует вводить значение for для создания исключения outofbounds.«Конечно, все это легко отлаживается для OP: S – annakata

3

вашего цикл контролируются й, но вы индексироваться с [следовательно, вы должны логикой, чтобы предотвратить получение гр больше размер массива]

2

В вашем цикле for вы используете c. Вам нужно использовать x. Могу ли я предложить вам взглянуть на reference for for.

Попробуйте это вместо того, чтобы ...

string[] msglines; 

msglines = System.IO.File.ReadAllLines(@"C:\\Users\xA\Desktop\MESSAGES.txt"); 


for (int x = 0; x < msglines.Length; x++) 
{ 
    this.textBox5.Text = msglines[x];      
} 
3

Поскольку вы повышаете индекс строки (c) на 2 каждый раз; просто использовать x:

this.textBox5.Text = msglines[x]; 

Конечно, из цикла это приведет только к последней строке показано на рисунке. Какая линия вы вы на самом деле хотите показать?


Редактировать комментарий; в этом случае просто:

StringBuilder sb = new StringBuilder(); 
for (int x = 1; x < msglines.Length; x+=2) 
{ 
    sb.AppendLine(msglines[x]); 
} 
this.textBox5.Text = sb.ToString(); 
+0

Я хочу, чтобы каждая нечетная строка отправлялась в текстовое поле ... вот почему я использовал c, который находится внутри c = 1 – 2009-05-27 07:57:49

0

Код я написал именно то, как я хочу, чтобы это было .....

Я на самом деле хочу, чтобы каждый нечетный строки из моего файла, который будет отправлен в текстовое поле. и да PS C инициализируется от 1

+1

, код может быть таким, каким вы хотите, но есть лучшие способы сделать то же самое вещь - ясно из ответов здесь ваш код запутывает, что является столь же серьезной проблемой, как любая – annakata

+2

Представьте себе msglines.Length of 5. Возьмите лист бумаги и запишите значения c и x для каждой итерации вашего цикла. – xsl

7

Если вы хотите получить каждую вторую строчку.

Изменить петлю на

//Odd Lines 
for (int x = 0; x < msglines.Length; x = x + 2) 
{ 
    this.textBox5.Text += msglines[x]; 
} 

//Even Lines 
for (int x = 1; x < msglines.Length; x = x + 2) 
{ 
    this.textBox5.Text += msglines[x]; 
} 

Как было отмечено в комментариях, вы можете сократить x = x + 2 к x += 2

И в интересах LinqY Совершенство ...

//ODDS 
msgLines 
    .Where((str, index) => index % 2 == 0) 
    .ToList() 
    .ForEach(str => textBox1.Text += String.Format("{0}\r\n", str)); 

//EVENS 
msgLines 
    .Where((str, index) => index % 2 == 1) 
    .ToList() 
    .ForEach(str => textBox1.Text += String.Format("{0}\r\n", str)); 
+0

или x + = 2 – Svish

+0

Для каждой нечетной строки измените на for (int x = 1; ... –

+0

Почему вторая, четвертая, шестую и т. Д. Нечетные строки? Это индексирование на основе 0, поэтому 0, 2, 4 все нечетные! – cjk

1

Затем вы должны использовать X в качестве индекса, с шагом 2, а не 1.

1

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

Давайте «Hello» в качестве примера для вашей msglines строки

alt text http://www.javabat.com/doc/string_index.png

и будем говорить, что ваша глобальная переменная с я инициализируются 0, прежде чем войти в цикл. Ваш msglines.Lenght будет равен 5. На четвертой итерации через цикл (x == 3) вы попытаетесь получить доступ к msglines [6], который находится за пределами границ массива, следовательно, ошибка.

Вы, вероятно, хотели что-то вдоль линий

int x = 0; 
while(x <= msglines.Lenght){ 
    this.textBox5.Text += msglines[x]; 
    x = x + 2; 
} 

или

for(x=0; x <= msglines.Lenght ; x+=2){ 
    this.textBox5.Text += msglines[x]; 
} 

Чтобы получить нечетные строки, которые вы бы начать с х инициализируется до 1.

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

1

Попробуйте

string[] msglines; 

msglines = System.IO.File.ReadAllLines(@"C:\Users\xA\Desktop\MESSAGES.txt"); 

for (int x = 0; x < msglines.Length; x++) 
    { 

     this.textBox5.Text = msglines[x++]; 

    }     
1

Вы говорите, что вы хотите все нечетные строки в TextBox, но ваш цикл будет показывать только последнюю строку, как вы перезаписать содержимое на каждом проходе.

Показать все нечетные строки, разделенные линией подведет

string lineSep = ""; 
for (int x = 0; x < msglines.Length; x += 2) 
{ 
    this.textBox5.Text += lineSep + msglines[x]; 
    lineSep = "\r\n"; 
} 
0

Помимо уже упомянутых проблем индексаций c против x, вы также перезапись textBox5.Text на каждой итерации, так что вы будете только когда-либо см. последнюю строку. Кажется, что-то маловероятно, что это будет предполагаемое поведение. Вы могли бы хотеть что-то вроде этого: вместо

this.textBox5.Text += msglines[x]; // note x instead of c 

Или, если вы действительно хотите все и +2 была опечатка в себе вы могли бы сделать это без каких-либо цикла:

this.textBox5.Text = String.Join("\n", msglines); 
0

Следующая функция будет возвращать IEnumerable, который дает нечетные строки в файле:

private IEnumerable<string> GetOddLines(string fileName) 
{ 
    string[] lines = File.ReadAllLines(fileName); 
    IEnumerator allLines = lines.GetEnumerator(); 
    while (allLines.MoveNext()) 
    { 
     yield return (string)allLines.Current; 
     if (!allLines.MoveNext()) 
     { 
      break; 
     } 
    } 
} 

Если вы хотите четные строки, просто добавьте вызов allLines.MoveNext() до цикла.

+0

Кроме того, вы всегда должны пытаться уничтожить счетчики, это проще, если вы используете общий IEnumerator , так как это реализует IDisposable. Но если вам нужен потоковый нечетный считыватель строк, было бы более эффективным начать с StreamReader ... –

+0

Вы правы, конечно ... :-) Методы File.ReadAll *** имеют тенденцию быть довольно медленными, но что это цена, которую вы платите за быстрый и легкий, я думаю. –

0

Вам необходимо закорачивать массив с длиной -1. Массив 45 Длина будет только индексироваться до 44.

Смежные вопросы