[C#] Программный возврат чтения на пару строк выше))))

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by NetSter, 5 Jul 2011.

  1. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    809
    Likes Received:
    412
    Reputations:
    62
    Привет ачат)
    есть трабла над которой бьюсь головой ап стенку)
    может все примитивно, но моск уже не может адекватно принять решение так что отпишу здесь, может кто посоветует)

    есть файл содержания примерно:
    так вот известно что в файле все строки случайные, а только есть один маркер
    ===========
    который есть всегда.
    остальная инфо случайная и непостоянная.
    Что собственно нужно.
    Построчно читать файл, если строка МАРКЕР найдена, то вернуться на 2 строки выше и считать строки
    fffffffffffffffffffff
    ddddddddddd
    так вот))
    как мне вернуться выше на 2 строки и продолжить чтение дальше, тоисть после маркера читать строку
    fffffffffffffffffffff

    ааа мужики чето я потерялся ) нид хелп)
    биг спс)
     
    _________________________
  2. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    295
    Likes Received:
    41
    Reputations:
    25
    Создай массив из трех строк.
    При чтении
    st[1]:=st[2];
    st[2]:=st[3];
    readln(ff,st[3]);
    if st[3]==маркер тогда st[1] и st[2] - искомые строки
     
  3. edge911

    edge911 Active Member

    Joined:
    21 Feb 2009
    Messages:
    105
    Likes Received:
    142
    Reputations:
    15
    2stream777:
    ты не прав, посмотри еще раз на задание.
    Code:
    ifstream file("имя_файла");
    
    vector<string> tmp;
    
    vector.push_back("0 строка");
    
    vector.push_back("1 строка");
    
    vector.push_back("2 строка");
    
    vector.push_back("3 строка");
    
    while(!file.eof())
    {
         tmp[3]=tmp[2];
    
         tmp[2]=tmp[1];
    
         tmp[1]=tmp[0];
    
         file >> tmp[0];
    
         if(tmp == "MARKER")
             {
                  cout << "1 строка" << tmp[3] << "2 строка" << tmp[2] < endl;
             }
    }
    file.close();
    
     
    #3 edge911, 6 Jul 2011
    Last edited: 6 Jul 2011
    NetSter and Steam[777] like this.
  4. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    я бы сделала очень просто.
    может это и не правильно с точки зрения размера кода но думаю это должно заработать
    два цикла

    while(не кокнец файла)
    {
    считать строку
    счетчик++
    }
    while(не кокнец файла)
    {
    for(i=0; i<счетчик-2; i++)
    {
    считать строку (первый раз заново начиная с начала файла)
    i++
    }
    //когда цикл FOR пройдет, то у нас 2 следующие строки те что нам нужно)
    str1result = readline();
    str2result = readline();
    }

    недостаток в том что нужно 2 раза поргонять файл.. а так вполне рабочий вариант))
    вот так вот мальчики))
     
  5. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    1. Читаем файл - var lines = File.ReadAllLines(""); - получаем массив строк.
    2. for to do -> files { if (lines.Equal("abc"))} { var line1 = lines[i - 2] ... (только проверяй как бы в минус не ушел)

    ну как-то так.
     
  6. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Или можно как-то так:
    Code:
            string[] GetSomething(FileStream fStream, string marker)
            {
                StreamReader sReader = new StreamReader(fStream);
    
                string line;
                Queue<string> prevLines = new Queue<string>(3);
    
                prevLines.Enqueue(string.Empty);
                prevLines.Enqueue(string.Empty);
                prevLines.Enqueue(string.Empty);
    
                while ((line = sReader.ReadLine()) != null)
                {
                    if (line == marker)
                    {
                        return new string[2] { prevLines.Dequeue(), prevLines.Dequeue() };
                    }
    
                    prevLines.Dequeue();
                    prevLines.Enqueue(line);
                }
    
                return null;
            }
     
    1 person likes this.
  7. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    295
    Likes Received:
    41
    Reputations:
    25
    2edge911 Думаю, основной смысл ТС понял. Конечно, в моём варианте будут получены [-1] и [-2] строка, а нужны [-2] и [-3], но основной смысл это не меняет.

    2W!z@rD Слишком расточительно с точки зрения использования ресурсов,читать весь файл в память. Вдруг там файл на 50 Гб? Читать его весь в память - любая тачка колом встанет...


    2Natali Osina Вариант то рабочий, но зачем дважды файл читать? Опять же,если файл занимает внушительный объем, и лежит вообще на сетевом ресурсе, как тогда будет работать такая реализация? :confused:
     
  8. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    2Stream[777]
    ты великолепен!
     
  9. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Массив начала новых строк и FileStream.Seek и FileStream.Position будет куда оптимальнее и проще вышепредложенного ^^
     
  10. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    1) CreateFileMapping + MapViewOfFile
    2) strstr в поисках строки маркера
    3) цикл с декрементом и пропускаете
    два маркера окончания строк "\x0D\x0A"
    в итоге указатель смотрит куда нужно
     
  11. B0ri$ka

    B0ri$ka Banned

    Joined:
    1 Jul 2011
    Messages:
    33
    Likes Received:
    2
    Reputations:
    0
    Это полная жесть!
    Как это развидеть?