Привет ачат) есть трабла над которой бьюсь головой ап стенку) может все примитивно, но моск уже не может адекватно принять решение так что отпишу здесь, может кто посоветует) есть файл содержания примерно: так вот известно что в файле все строки случайные, а только есть один маркер =========== который есть всегда. остальная инфо случайная и непостоянная. Что собственно нужно. Построчно читать файл, если строка МАРКЕР найдена, то вернуться на 2 строки выше и считать строки fffffffffffffffffffff ddddddddddd так вот)) как мне вернуться выше на 2 строки и продолжить чтение дальше, тоисть после маркера читать строку fffffffffffffffffffff ааа мужики чето я потерялся ) нид хелп) биг спс)
Создай массив из трех строк. При чтении st[1]:=st[2]; st[2]:=st[3]; readln(ff,st[3]); if st[3]==маркер тогда st[1] и st[2] - искомые строки
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();
я бы сделала очень просто. может это и не правильно с точки зрения размера кода но думаю это должно заработать два цикла while(не кокнец файла) { считать строку счетчик++ } while(не кокнец файла) { for(i=0; i<счетчик-2; i++) { считать строку (первый раз заново начиная с начала файла) i++ } //когда цикл FOR пройдет, то у нас 2 следующие строки те что нам нужно) str1result = readline(); str2result = readline(); } недостаток в том что нужно 2 раза поргонять файл.. а так вполне рабочий вариант)) вот так вот мальчики))
1. Читаем файл - var lines = File.ReadAllLines(""); - получаем массив строк. 2. for to do -> files { if (lines.Equal("abc"))} { var line1 = lines[i - 2] ... (только проверяй как бы в минус не ушел) ну как-то так.
Или можно как-то так: 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; }
2edge911 Думаю, основной смысл ТС понял. Конечно, в моём варианте будут получены [-1] и [-2] строка, а нужны [-2] и [-3], но основной смысл это не меняет. 2W!z@rD Слишком расточительно с точки зрения использования ресурсов,читать весь файл в память. Вдруг там файл на 50 Гб? Читать его весь в память - любая тачка колом встанет... 2Natali Osina Вариант то рабочий, но зачем дважды файл читать? Опять же,если файл занимает внушительный объем, и лежит вообще на сетевом ресурсе, как тогда будет работать такая реализация?
Массив начала новых строк и FileStream.Seek и FileStream.Position будет куда оптимальнее и проще вышепредложенного ^^
1) CreateFileMapping + MapViewOfFile 2) strstr в поисках строки маркера 3) цикл с декрементом и пропускаете два маркера окончания строк "\x0D\x0A" в итоге указатель смотрит куда нужно