Всё поправил, но вместо 22 ошибок вылезло всего 5: Code: C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(60) : error C2039: 'cout' : is not a member of 'std' C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(60) : error C2039: 'atoi' : is not a member of 'std' C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(60) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type '' (or there is no acceptable conversion) C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(62) : error C2039: 'cout' : is not a member of 'std' C:\Äëÿ Ñ++\newsreader1\newsreader1.cpp(62) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type '' (or there is no acceptable conversion)
а вообще при работе со строками советую работать с библиотекой что парсит нужный тебе текст В твоем случае я бы внес в одну строчку например: char Buffer[]=""<html><head><title>lol</title></head>\ <body><table><td class=\"num\">416</td></table>\ </body></html>""; char met[]=""<td class=\"num\">""; char Answer[50]; if(cut_str_to_char(Buffer, met, '<', Answer, 50)) cout << Answer; else count << "Error";
Значит не все, #include добавил необходимые? Строку using namespace std убрал? Надо было мой код целиком копировать.
Code: // newsreader1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <wininet.h> #pragma comment(lib,"wininet") #include <stdlib.h> #include "fun.h" #include <fstream.h> #include <iostream.h> #include <locale.h> #include <stdlib.h> #include <string> #include <math.h> using namespace std; int main(int argc, char* argv[]) { char login[32], pass[32], req[5000]; cout << "Login: "; cin >> login; cout << endl << "Password: "; cin >> pass; conect(login,pass); FILE *fp; char buf[5000], *p; int c; const char *fname = "page.html"; if ((fp = fopen(fname, "rb")) == NULL) return 1; for (p = buf; p-buf < 5000-1 && (c = getc(fp)) != EOF; p++) *p = c; *p = '\0'; //printf("%s", buf); fclose(fp); if(strstr(buf,"login")==NULL){ cout << "\nDone!\n"; } else{ cout << "\nLogin error\n"; return 1; } /*char *search="<h1>"; char *mbuf; //òóò òåêñò, áîëüøîé mbuf=strstr(buf,search); mbuf=strtok(mbuf,"<b"); mbuf=strtok(mbuf,"h1>"); cout << "Village: " << mbuf << endl; //goGet("","/build.php?id=1");*/ std::string text("<html><head><title>lol</title></head><body><table><td class=\"num\">416</td></table></body></html>"); std::string to_find("<td class=\"num\">"); std::string::size_type pos; if((pos = text.find(to_find)) != std::string::npos) std::cout << std::atoi(text.c_str() + pos + to_find.length()) << std::endl; else std::cout << "Not found" << std::endl; return 0; } Вот весь код, какие нужны инклюды? Что вообще надо сделать чтобы работало? P.S. Там в коде некоторые функции самописные
Знаешь, забудь все, чему я учил, и пиши на чистом си, раз уж у тебя такой омг-код, каша из смеси сишника и с++. Ты же взял и просто скопировал код моего примера, т.е. вообще без мыслей и понимания. Переписывать такой треш, который ты показал, я не буду)
Так там всё и не надо, только инклюды и тот код который ты кинул... Вообще я C и С++ не сильно различаю... читал литературу по С++ там коды все выглядят также как и у меня!
Я привел вообще пример для конкретного html-кода, а ты и его сунул себе... Если бы ты писал на с++ с использованием классов stl, то не было бы такой жести с чтением файла page.html, который в твоем случае не длиннее 5000 байт может быть. Было бы примерно так: PHP: std::ifstream file; file.open("page.html", std::ifstream::in); if(!file) { std::cout << "Error opening file"; return; } std::string buf; std::copy(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), std::back_inserter(buf)); file.close(); //Теперь в buf - все полностью, что лежало в файле page.html Надеюсь, ты видишь разницу. Вообще, советую взяться за более простой язык программирования, если в этом знаний нет.
Jest Я щас пьяный но скажу тебе что гг, не парся используй библиотку rudi.cpp для работы со строками и не будешь знать горя скачать Rudi.cpp и тогда код сработает PHP: char Buffer[]="<html><head><title>lol</title></head>\ <body><table><td class=\"num\">416</td></table>\ </body></html>"; char met[]="<td class=\"num\">"; char Answer[50]; if(cut_str_to_char(Buffer, met, '<', Answer, 50)) cout << Answer; else count << "Error"; Коасткое описание в rudi.cpp внутри
Небольшой вопрос - зачем было писать то, что уже написано и содержится в стандартной библиотеке c++?)) А во-вторых, у него не скомпилится твоя библиотека PHP: void my_sleep_1000(int sec) { int x =0; while(x < sec) { Sleep(50); Application->ProcessMessages(); //Это что, из борланда? А если он использует VC++? x +=50; } } Охчерт, а это же вообще убиться, инклюды внутри тела функции... PHP: void tolowerStr(char *Str) { #include <windows.h> #include <ctype.h> SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_CTYPE,"Russian"); int len = strlen(Str); for(int c=0; c<len; c++) Str[c] = tolower(Str[c]); } Полистал я библиотеку твою... По-моему ты всегда пьяный, причем сильно...
да да void my_sleep(float sec); void my_sleep_1000(int sec); Это убери в rudi.cpp сотри нафиг и тогда все запашет
По-моему там не си и не си++, а хардкор вечнопьяного программиста. А уж в борланде вообще есть AnsiString, в VC++ можно использовать string, на крайний случай - скачать какой-нибудь boost и радоваться тому, что все за тебя уже написали. Если бы там был чистый си, то не было бы всяких объявлений переменных посередине функций, не было бы Application->ProcessMessages() и #include <iostream>...
Ты не прав насчет хрени. Это не хрень, это <censored> бред пьяного идиота. PHP: bool cut_to_str(char *source, char *End, char *dest, size_t MaxSize) { size_t len = 0; char *pt = strstr(source,End); if( !pt ) {dest[0] = 0; return false;}; len = pt - &source[0]; if(len > (MaxSize-1)) {dest[0] = 0; return false;}; strncpy(dest,source,len); dest[len] = 0; return true; }; void tolowerStr(char *Str) { #include <windows.h> #include <ctype.h> SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_CTYPE,"Russian"); int len = strlen(Str); for(int c=0; c<len; c++) Str[c] = tolower(Str[c]); } Никогда не пиши больше код. Читай книжки. Веди трезвый образ жизни. Никогда не показывай людям ТАКОЙ код. Да меня блин вырвало, когда я ЭТО скачал и посмотрел! Серьезно, писать такой бред... Функция tolowerStr() - просто шедевр, я распечатаю и повешу себе на стенку.
GRRRL Power Я не особо знаю стандартные функции С++ Но мне будет интересно у тебя узнать как можно например справиться с такой задачей есть следующее: char Str[]="hello my dear friend Max, How are you?"; char Name[128]; Нужно считать из строки Str в буффер Name Имя Max как это сделать? _______ Bers Я выложил тут работу со строками а не ToLower ToLowerStr - тут лишнее, сугубо личное использование перевод русских символов в нижний регистр
Если принять, что имя расположено между "friend " и запятой, то так: PHP: #include <string> #include <iostream> void main() { const std::string str("hello my dear friend Max, How are you?"); std::string to_find("friend "); std::string::size_type pos, pos2; if((pos = str.find(to_find)) != std::string::npos && (pos2 = str.find(',', pos)) != std::string::npos) { pos += to_find.length(); std::string name(str.substr(pos, pos2 - pos)); std::cout << name << std::endl; } } Заметь, никаких просчетов длин буферов, поиска конца строк по нулевому байту и подобного си. И имя, и строка могут быть любой длины.
GRRRL Power Интересный конечно код. В моем Cpp так можно было бы сделать cut_str_to_char(Str, "friend ", ',', Name, 128); намного короче и понятнее
О да, я знал, что ты это напишешь. Но что мешает обернуть мой код в аналогичную функцию? Отличие будет в том, что не нужно будить париться с длинами буферов и делать унылые циклы.
согласен, если обернуть твой код , то тоже будет коротко и понятно Отличие лишь в том что память будет выдяляться динамически, которую и освобождать потом кстате нужно каждый раз а если например, мне нужно выделять память для ответа не более 10 байт? И если ответ более 10 байт то считать ответ ошибочным. Потому предпочитаю передавать уже выделенный заранее участок памяти Ведь например мы получили страницу HTML и нам нужно выдернуть отттуда например Имя юзера мы знаем что имя его между тегами <h1 class="Name"> Юра<\h1> Сегодня наша программа работает коректно, выдергивает имя Юра и выделяет память для него А завтра на сайте произошли изменеия, и имя Юра в других тегах теперь. Твой парсер например начнет глючить, пытаясь выдернуть имя из старых тегов а старых тегов уже нету, парсер будет искать другие похожие теги и если найдет удовлетворяющие условия выдернит типа имя на несколько килобайт длинною, в которых будет не имя а кусок кода страницы, просто попашего в твои условия выделив для этого память. А если указать максимальную длину ответа, то такого не произойдет.... Спорить можно долго, согласен что с выделением динамической памяти есть и свои плюсы но думаю не в этом случае