выдает ряд ошибок PHP: #include <iostream> sing namespace std; int main() { int n; float s=0; const int n=20; float a[n]; for (int i=0; i<n; i++) { cout<<"\n vvedite "<<i<<" chislo "; cin>>a[i]; } for (i=0; i<n; i++) if (i % 2==0) s=s+a[i]; cout<<"\n s="<<s; } показывает ошибку в 7,5 и 14.
Code: #include <iostream> using namespace std; int main() { float s=0; const int n=20; int a[n]; for (int i=0; i<n; i++) { cout<<"\n vvedite "<<i<<" chislo "; cin>>a[i]; } for (int i=0; i<n; i++) if (i % 2==0) s=s+a[i]; cout<<"\n s="<<s; return 0; }
Здравствуйте. Пытаюсь написать самую первую программу по книге Джесса Либерти, Hello World, но не получается. Все делаю по книге. Подскажите в чем ошибка? Привожу пример #include <iostream.h> int main() { cout << "Hello World!\n"; return 0; } Выдает такую ошибку Compiling... Error spawning cl.exe san.exe - 1 error(s), 0 warning(s)
С большой вероятностью можно предположить, что VS была установлена с выборочными компонентами, и какой то из них, необходимый, не был установлен. Советую переустановить VS и оставить все компоненты по умолчанию. Если ошибка повториться - значит дело в чем то другом.
Code: #include <iostream> #include <Windows.h> #define BUF_SIZE 256 int main() { char szBuf[BUF_SIZE]; DWORD dwSize; dwSize = sizeof(szBuf); GetUserNameA(szBuf,&dwSize); std::cout << szBuf; std::cin.get(); return 0; }
Сокеты - загрузка содержимого сайта Здравствуйте, использую linux(т.е. winAPI не предлогать) и компилятор g++... Хочу с помощью сокетов получить ответ от сервера(nginx), но ответ от сервера приходит только частично, похоже проблема в том что recv не успевает получить ответ... Как можно это исправить? Заранее очень благодарен за помощь! Код: Code: #include <stdlib.h> #include <iostream> #include <sys/socket.h> #include <sys/types.h> #include <netdb.h> #include <netinet/in.h> #include <assert.h> #include <stdio.h> #include <sstream> using namespace std; int main() { char site[] = "nixmail.ru"; char message[] = "GET / HTTP/1.1\r\nHost: nixmail.ru\r\n User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5\r\n Accept: text/html\r\nConnection: close\r\n"; int sock; char buf[2097152]; struct sockaddr_in addr; struct hostent* host = gethostbyname(site); sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { perror("socket"); exit(1); } addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = ((in_addr*)host->h_addr_list[0])->s_addr; if(connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("connect"); exit(2); } send(sock, message, sizeof(message), 0); recv(sock, buf, sizeof(buf), 0); cout << buf << endl; close(sock); return 0; }
olgnet, стремно ты написал: Такой большой буфер не нужен. Обычно хватает 4096 или 8192 байт. Но считывать нужно в цикле, например так: Code: char buf[8193]; ... int x; while(x = recv(sock, buf, 8192, 0) > 0) { buf[x] = 0; cout<<buf; }
Огромное спасибо, всё работает... Но у меня есть несколько вопросов(недавно начал изучать с++) 1) Ответ сервера ведь может превышать 8192... Нет ли какого-то универсального решения автоматически подбирающего кол-во элементов массива 2) Во всех примерах, которые мне попались для строк используется тип char в виде массива, почему не используется string? 3) В случае с выводом поток в конце используется endl, в вашем примере его нет... Для чего он вообще?)
1) Нету, так как неизвестно, сколько байт хочет отправить сервер. Нужно принимать данные частями и при необходимости объединять блоки в один поток (массив). Но все-таки в HTTP протоколе сервер может сообщить, сколько данных собирается отправить. За это отвечает заголовок Content-Length. (Также при Transfer-Encoding: chunked сервер тоже сообщает, сколько данных еще придет в следующей части.) recv возвращает 0, если соединение закрыто и -1, если произошла ошибка. Код ошибки можно узнать вызвав функцию GetLastError(). 2) recv принимает второй параметр - указатель на символьный массив. Если сначала установить размер строки string, то ее также можно будет использовать в recv. Только передавать надо будет в recv не саму переменную типа string, а результат метода c_str() этой пенременной. 3) В моем примере нету endl, потому что он бы немного изменил результат вывода. endl - это переход на новую строку. Если бы в моем примере он был, то после каждых x принятых байт выводился бы также переход на новую строку. В примере это не критично, но в реальных проектах так делать нельзя.
Ещё раз спасибо! Если можно, поподробнее про принятие данных частями... Не совсем понял как это, нужно в функции recv меняться третий параметр или есть какой-то другой метод, просто если я не буду ограничивать полученные данные то я всё равно могу получить данных больше чем предусматривает элемент массива, который я потом буду склеивать и получать полный ответ