Если использовать NativeApi, то lstrcatA(str1,str2); lstrcpyA(str1,str2); или же сишные прототипы strcat(str1,str2); strcpy(str1,str2); которые по сути являются оберткой для тех же NativeApi
я знал про lstrcatA() и lstrcpyA(), они из той же поэмы примерно что и wsprintfA, но зато теперь не компилируется, а показывает хоть в чем проблема - cannot convert parameter 1 from 'std::string' to 'LPSTR', как я и предполагал проблема в стрингах=), надо либо обрубать строку без string примочек, либо переводить полученную переменную string в char, а с фантиками типа strcat и strcpy, полагаю, будет тоже самое.
Могу предложить, при использовании lstrcpyA, в параметрах передавать не переменные, а указатели на эти переменные. Уж прости, не знаю как это будет в кодесе на сях, т.к. не знаком с синтаксисом и никогда на них не писал, не считая вчерашнего примера)
Могу предложить выбрать уже: либо C++, либо C. Если C++, то lstrcat, wsprintf для склеивания строк и strchr - нафиг не нужны.
Можно ли с помощью select() организовать цикл и выход из него по истечении определенного времени? Например: Code: fd_set rfds1; timeval tv1; FD_ZERO(&rfds1); FD_SET(0, &rfds1); tv1.tv_sec = 30; tv1.tv_usec = 0; While (timeout != 0) { ... // в течении 30 сек длится цикл } И как это должно выглядеть, если возможно вообще.
Вообще, задержку обычно делают при помощи Sleep. Если тебе нужно в течении 30 секунд, выполнять некие манипуляции в цикле, то можно создать отдельный поток, а по истечении Sleep(30000), просто убить его.
со Sleep всё очевидно, на счет доп. потока тоже идея была, отложил пока, думал мб select'ом решается, не хотелось бы плодить кучу кода, ладненько, разберёмся)
С потоком который прихлопывается насильственно надежнее, а кода там не будет куча. Сделай обертку на получение и она верой и правдой прослужит тебе в куче кодесов где пригодится и не придется заново все писать. Со временем к ней добавится возможность юзать GET и POST запросы и все хорошо. Есть еще boost::asio, но ИМХО неудобная штука. Мне вообще ближе всего прямая работа с TDI. Куда приятнее чем winsock.
Code: void Myfunc() { while (!IP.eof()) // пока не достигнут конец файла { //... делаем определенные действия } } int main() { fstream IP; IP.open("ips.txt"); Myfunc(); IP.close(); } Подскажите, как передать в Myfunc(), массив адресов IP полученный в main()
Благодарю, всё оказалось так просто, лишь немного поправил, авось кому пригодится тоже: Code: void Myfunc(fstream &IP) { while (!IP.eof()) // пока не достигнут конец файла { //... делаем определенные действия } } int main() { fstream IP; IP.open("ips.txt"); Myfunc(IP); IP.close(); }
А если в несколько потоков хочу запустить? пробую так: Code: void Myfunc(fstream &IP) { while (!IP.eof()) // пока не достигнут конец файла { //... делаем определенные действия } } int main() { fstream IP; IP.open("ips.txt"); for (int counter = 0; counter < 2; counter ++ ){ Thread = _beginthreadex(NULL, 0, Myfunc(IP), NULL, 0, NULL); } IP.close(); } Получаю: error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void' to 'unsigned int (__stdcall *)(void *)' пробовал менять "void Myfunc(fstream &IP)" на "unsigned __stdcall Myfunc(fstream &IP)", получил: error C2664: '_beginthreadex' : cannot convert parameter 3 from 'unsigned int' to 'unsigned int (__stdcall *)(void *)
функция, которая передается в _beginthreadex должна иметь следующий прототип: Code: void( __cdecl *start_address )( void * ) то есть возвращать uintptr_t, принимать в качестве параметра указатель на войд и иметь соглашение вызова stdcall. в твоем случае код должен выглядеть примерно так: Code: #include <fstream> #include <process.h> uintptr_t __stdcall Myfunc(void *data) { std::fstream *IP = reinterpret_cast<std::fstream*>(data); while (!IP->eof()) { } return 0; } int main() { std::fstream IP; IP.open("ips.txt"); for (int counter = 0; counter < 2; counter++) { uintptr_t Thread = _beginthreadex(NULL, 0, Myfunc, NULL, 0, NULL); } IP.close(); } но лучше вместо этого трешака юзать std::thread и не парить себе мозги.
а если применить thread, как тогда будет выглядеть всё это дело? я ж не против, но масса людей сетует, что лучше юзать _beginthreadex из самой VS.
как то так Code: #include <fstream> #include <thread> #include <vector> int main() { std::fstream ip_list; ip_list.open("ips.txt"); std::vector<std::thread> threads; for (auto thread_index = 0; thread_index < 2; ++thread_index) { threads.push_back(std::thread([&]() { ip_list.clear(); // do something })); } for (auto current_thread = 0; current_thread < threads.size(); ++current_thread) threads[current_thread].join(); ip_list.close(); }
Подскажите универсальный справочник где можно почитать о классах, функциях и библиотеках C++. Не удобно читать о <string> в википедии... К примеру php.net можно полностью язык выучить сидя тупо на нем.