Странный результат с readline/writeline

Привет всем гениям!

Я попытался создать код, который читает текстовый файл и берет каждую строку, начинающуюся со слова «ЧАСТЬ» в этом файле, и помещает ее в новый файл.

Почему-то в выходном файле отсутствует каждая вторая строка исходного файла. Это мой код:

{
    string line ="";
    string Starttext = "PART";
    using (System.IO.StreamReader reader = new System.IO.StreamReader(@"C:\Users\tsnm2171\Desktop\processed\LABB\ORIGINAL.txt"))          
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(@"C:\Users\tsnm2171\Desktop\processed\LABB\OUTPUT.txt"))


        while (reader.ReadLine() != null)                   

        {   line = reader.ReadLine();

            if (line.StartsWith(Starttext))
                {
                    //writes/starts a new line beginning with PART

                    writer.WriteLine(line);
                }
                else 

                {
                    //appends info to same line (beginning with a space)
                    writer.Write(" " + line);
                }                       
        }
}        

Исходный файл выглядит так:

KABEL           RXF 4x25
PART        01      1   1       
PART        02      2   2       
PART        03      3   3       
PART        04      4   4       
PART        SH      GND GND     
KABEL           RXF 4x35    0000000456  Cable RXF 4x35
PART        01  1   5   5       
PART        02  1   6   6       
PART        03  1   7   7       
PART        04  1   8   8       
PART        SH  1   GND GND     
KABEL           RXF 4x35    0000000456  Cable RXF 4x35
PART        01  1   9   9       
PART        02  1   10  10      
PART        03  1   11  11      
PART        04  1   12  12      
PART        SH  1   GND GND

Но в выходном файле отсутствуют строки «Часть 02» и «Часть 04», как показано ниже:

PART        01      1   1       
PART        03      3   3       
PART        SH      GND GND     
PART        01  1   5   5       
PART        03  1   7   7       
PART        SH  1   GND GND     
PART        01  1   9   9       
PART        03  1   11  11      
PART        SH  1   GND GND

Почему?


person Tomas Nordström    schedule 19.09.2017    source источник
comment
Вы звоните ReadLine дважды для каждого WriteLine звонка. Вы почти наверняка хотите while ((line = reader.ReadLine()) != null) и удалить последующий вызов.   -  person Jon Skeet    schedule 19.09.2017
comment
Я попробую это. Всегда ли ReadLine читает следующую строку каждый раз, когда она вызывается? Могу ли я как-то вызвать значение в строке раньше... например, readline(-1) или что-то в этом роде, чтобы прочитать строку раньше?   -  person Tomas Nordström    schedule 19.09.2017
comment
Всегда ли ReadLine читает следующую строку каждый раз, когда она вызывается? Ну да - это то, что он должен делать. И нет, вы не можете попросить его просто запомнить... если вы хотите сохранить результат предыдущего вызова, вам нужно сделать это самостоятельно.   -  person Jon Skeet    schedule 19.09.2017
comment
Не работало так, как я хотел. В результате каждая строка, начинающаяся со слова KABEL, также копировалась в выходной файл, но с пробелом перед строкой. Также первая строка каждой группы PART была добавлена ​​непосредственно к строке KABEL. Хм... Есть еще идеи?   -  person Tomas Nordström    schedule 19.09.2017
comment
По сути, сейчас самое время использовать отладчик. (Но учтите, что иногда вы звоните Write, а иногда WriteLine. Я сильно подозреваю, что это важно.)   -  person Jon Skeet    schedule 19.09.2017
comment
Ха-ха... нашел это сейчас. Спасибо за подсказку. :-)   -  person Tomas Nordström    schedule 19.09.2017


Ответы (1)


reader.ReadLine() фактически читает строку из файла и перемещает курсор на следующую строку.

Вы дважды вызвали reader.ReadLine() в цикле while

правильный путь

while ((line = reader.ReadLine()) != null) 
{
   // Do your work
}
person Neverever    schedule 19.09.2017