Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Конец строки, что-то не идет...


Автор: Killer_13 11.10.2010, 19:00
Здравствуйте.
Есть у меня огромная строка из нее нужно выбрать определенные слова, с этим вроде все в порядке. smile

Но у меня идет циклом, так что выводится столько раз, сколько символов в строке около 2000 строк.
Тоисть та информация что я выдираю из строки повторяется много раз.

Нужно определить, что найден последний элемент в строке и прекратить писать в файл.

например pos2=2005 , а длина строки 2015, и pos2 который на 2005 позиции последний искомый элемент, если это так, то нужно прекратить поиск в строке

Нашел похожую тему, но че-т с getline не получилось: http://forum.vingrad.ru/topic-211976.html

вот функция:
Код

void teilString(string& str){

    int pos1,pos2,grenz=str.length();
    string teil;

    pos2 = str.find("</");
    pos1 = str.rfind(">",pos2);

    aus<<teil.assign(str,pos1+1,pos2-pos1-1)<<"\n";

    for (int i=0;i<str.length();i++){
        pos2 = str.find("</",pos2+1);
        pos1 = str.rfind(">",pos2-1);
        aus<<teil.assign(str,pos1+1,pos2-pos1-1)<<"\n";
        }
}


Код

ofstream aus;


Спасибо.

Автор: bsa 11.10.2010, 19:17
используй break.... Больше ничего посоветовать не могу, так как текст слишком сумбурен и непонятен.

Автор: Killer_13 11.10.2010, 19:20
Вот такая вот строка.
Цитата

<OOP_Praktikum><Anmeldung><Nachname>Wuebbelmann</Nachname><Vorname>Juergen</Vorname><Email>[email protected]</Email><Matrikelnummer>012345</Matrikelnummer><Studienrichtung>TI</Studienrichtung><Semester>3</Semester><G1Name>Meier</G1Name><G1Vorname>Hugo</G1Vorname><Anmerkung></Anmerkung></Anmeldung><Anmeldung><Nachname>Duck</Nachname><Vorname>Donald</Vorname><Email>[email protected]</Email><Matrikelnummer>000001</Matrikelnummer><Studienrichtung>Enterei</Studienrichtung><Semester>30</Semester><G1Name>Duck</G1Name><G1Vorname>Daisy</G1Vorname><Anmerkung>ImmernochmitDaisy</Anmerkung></Anmeldung><Anmeldung><Nachname>Gans</Nachname><Vorname>Gustav</Vorname><Email>[email protected]</Email><Matrikelnummer>999999</Matrikelnummer><Studienrichtung>GansheitlichesBraten</Studienrichtung><Semester>9+</Semester><G1Name>Duck</G1Name><G1Vorname>Donald</G1Vorname><Anmerkung></Anmerkung></Anmeldung><Anmeldung><Nachname>Duck</Nachname><Vorname>Daisy</Vorname><Email>[email protected]</Email><Matrikelnummer>000002</Matrikelnummer><Studienrichtung>Enterei</Studienrichtung><Semester>9+</Semester><G1Name>Duck</G1Name><G1Vorname>Donald</G1Vorname><Anmerkung>WiedermitDonald</Anmerkung></Anmeldung><Anmeldung><Nachname>Gans</Nachname><Vorname>Gustav</Vorname><Email>[email protected]</Email><Matrikelnummer>999999</Matrikelnummer><Studienrichtung>GansheitlichesBraten</Studienrichtung><Semester>9+</Semester><G1Name></G1Name><G1Vorname></G1Vorname><Anmerkung>NichtmitDonald!WennsseinmussmitMickey.</Anmerkung></Anmeldung><Anmeldung><Nachname>Wuebbelmann</Nachname><Vorname>Juergen</Vorname><Email>[email protected]</Email><Matrikelnummer>012345</Matrikelnummer><Studienrichtung>TI</Studienrichtung><Semester>3</Semester><G1Name>Meier</G1Name><G1Vorname>Hugo</G1Vorname><Anmerkung>WasistOOP?</Anmerkung></Anmeldung><Anmeldung><Nachname>Paulsen</Nachname><Vorname>Paul</Vorname><Email>[email protected]</Email><Matrikelnummer>0815</Matrikelnummer><Studienrichtung>TI</Studienrichtung><Semester>3</Semester><G1Name>Meier</G1Name><G1Vorname>Hugo</G1Vorname><Anmerkung>WasistOOP?</Anmerkung></Anmeldung></OOP_Praktikum>



Модератор: сделал сообщение более читабельным

Автор: bsa 11.10.2010, 19:45
Killer_13, я очень рад за тебя. А дальше что? Ну строка. Хорошо. очень похоже на XML.
Ты по-русски расскажи, что ты хочешь получить.

Автор: Killer_13 11.10.2010, 21:37
Да, был xml, теперь забил все в одну строку и нужно достать инфу из тэгов.

Wuebbelmann
Juergen

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

Автор: djamshud 12.10.2010, 10:25
У вас цикл бестолковый. Делайте
Код

while((pos2=...)!=-1||(pos1=...)!=-1)
get_substring


Добавлено @ 10:27
Вместо -1 более кошерно использовать std::string::npos.

Автор: xvr 12.10.2010, 11:23
Чем не устраивают готовые НОРМАЛЬНЫЕ xml парсеры (имя коим легион)?

Автор: Killer_13 12.10.2010, 12:40
Дык ненаю я нормальных парсеров, просто задачку нуно написать.
djamshud
Пасиб, попробую сегодня.

Автор: djamshud 12.10.2010, 13:10
Killer_13, http://xmlsoft.org/

Автор: W4FhLF 12.10.2010, 13:19
Я бы посоветовал: http://code.google.com/p/pugixml/

Автор: Killer_13 12.10.2010, 22:11
Хммм, опять чо-то странное..
Чуток переделал функцию.

Вот так
Код

void teilString(string& str){

    int pos1,pos2;
    string teil;

    pos2 = str.find("</");
    pos1 = str.rfind(">",pos2);
    aus<<teil.assign(str,pos1+1,pos2-pos1-1)<<"\n";
 
    while((pos2 != string::npos) || (pos1 != string::npos)){
        pos2 = str.find("</",pos2+1);
        pos1 = str.rfind(">",pos2);
        aus<<teil.assign(str,pos1+1,pos2-pos1-1)<<"\n";
    }
}


Но здесь происходит зацыкливание! Не понямаю почему!!!
Протестировал дебаггером раза три, так вот доходит строка до конца. pos2=-1 а потом цыкл проверяет и пускает это значение дальше. Не могу понять?? Не должен же!
вместо string::npos пробовал ставить -1 результат такой же.

Уважаемые, мне не нужно серьезно вникать в с++ пока, мне нужно написать 1 задачу.
Спасибо.

Автор: Crafty 12.10.2010, 22:39
В условии цикла || на && замените.

Автор: Killer_13 12.10.2010, 22:49
Йомайо, так и хотел попробовать, но почему то руки не дотянулись, в голове произошла мысль, что должно работать и с "или" почему же не работало с или, можете обьяснить в двух словах. Должно было работать, тоисть условие срабатывало, если хотя бы одно из значений "-1" = почему не срабатывало?

Спасибо!

Автор: Killer_13 12.10.2010, 23:13
Вах, откуда на таком хорошем форуме спам полез, и не стыдно господам спамерам... :(

Автор: djamshud 12.10.2010, 23:34
Killer_13, это я дурак. Сначала поставил &&, потом подумал и исправил на ||, решив, что лучше проверить сразу обе позиции на -1. && говорит, что достаточно найти один конец: true && false = false.

Автор: Killer_13 12.10.2010, 23:57
Пасиб, с преподом искали ошибку не нашли. smile Потом с дебаггером искал, тож не нашел. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)