Raskal ты зря думаешь что мне рано и я задаю вопросы потому, что жить скучно. У меня на компе самоучителей по С++ штук 8 валяется....один из них меня заинтересовал "освой С++ за 21 день" и я его читаю.....просто во всех книгах описываются перегруженные функции, операторы, типы данных и классы, как по шаблону....но нигде не написанна разница между массивами данных массивом данных заканчиваюшимся 0 и анси строкой заканчивающейся 0.....Просто после Object Pascal где был тип string такое изобилие строк в с++ мне непонятно...... И если так трудно ответить на такой простой вопрос, может вопрос не такой уж простой? Я пытаюсь делать так: private: System::Void bbConn_Click(System::Object^ sender, System::EventArgs^ e) { String ^szAddr = "172.23.0.74"; SOCKET hSocket; struct sockaddr_in server; //Получаем IP servera szAddr = textBox1->Text; //Создаем сокет hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //Заполняем структуру sockaddr_in server.sin_family = AF_INET; server.sin_port = htons(1313); server.sin_addr.S_un.S_addr = inet_addr(szAddr); iRet = connect(hSocket, server, sizeof(server)); } А он говорит: error C2664: inet_addr: невозможно преобразовать параметр 1 из 'System::String ^' в 'const char *' Я и пытаюсь разобратся в изобилии строк С++.....Раздел ведь для новичков....
ну а зачем ты себе жизнь усложняешь, используя мэнэджед с++ ? разберись сначала с чистым с++ без всякого гуя. а ты пытаешься все и сразу освоить. char* - обычный массив символов, заканчивается на 0. но не обязательно. ибо в си как таковых строк не было. в си все массивы по сути байтовые, суй что хочешь. просто задание типа char подсказывает программисту, что это массив символов. но ты легко засунешь туда любые байты, которые не отражают никаких символов. а char* как раз растет из си. на деле этот тип данных используют очень редко. только при вызовах апи. ибо в виндос строки представляют из себя также терминированные нулем массивы байтов. но внутри своей программы ты можешь(и даже должен) использовать более адекватные типы. например класс std::string. по сути это просто оболочка для char*. по сути все классы строк - оболочки для char*. они управляют памятью, предоставляют сервисные методы типа toUpper, или перегруженные методы для сравнения и складывания строк. У всех есть метод получения указателя на строку. для того, чтобы как раз использовать эти классы с системными вызовами. дальше идет класс CString из atl или мфц. он весьма удобный, но не кроссплатформенный. у него метод получения строки GetBuffer(). у класса std::string метод получения указателя c_str(). так же операторы перегружены приведения типов, например LPCSTR. а вот использование мэнэджэд с++ приводит к проблемам, ибо по философии дотнет программисту не дается право управлять памятью напрямую. управление памятью лежит на совести вм дотнета. суть в том что мэнэджэд программы не должны вызывать апи и старые функции. потому что это нарушает философию. для этого в дотнете есть ОГРОМНОЕ количество классов, полностью повторяющих апи. именно поэтому учиться с++ с мэнэджэд плюсов мягко говоря глупо. ты учишь наполовину с++ наполовину дотнет, причем не понимаешь, в чем суть дотнета. хочешь делать окошки - используй мфц проекты с++.
Помогите решить вот такую задачу на языке C Буду очень благодарен! Нужно срочно сдать, но я даже в задание не врубаюсь ((
у тебя в out копируется принятые данные только один раз, убери точку с запятой после while. Вот например:
не работает цикл поиска задача найти в файле 1.bin байт E9 там он точно есть однако цикл почему то работает безконечно то есть прога просто виснет и все Code: #include <iostream> #include <fstream> using namespace std; char buffer = 0; int counter = 0; int bufer0 = 0; int bufer1 = 0; int adres = 0; const char filename1[] = "1.bin" //имена файлов const char filename2[] = "2.bin"; int main(void) { fstream file1(filename1,ios::in); //открываем файлы fstream file2(filename2,ios::out); file1.seekg(adres,ios::beg); //начальная установка адреса чтения (0) чтение с начала файла file2.seekp(adres,ios::beg); //начальная установка адреса записи (0) запись с начала файла while(bufer0 != 233) // цикл поиска байта 0xE9 { file1.seekg(adres); // устанавливаем адрес file1.read(&buffer,1); // считываем содержимое по адресу в буфер bufer0 = buffer; adres ++; // inc adres } // зацикленно //закрыть файлы file1.close(); file2.close(); return 0; }
ysmat char buffer = 0; - знаковое целое. максимальное значение +127. а ты проверяешь с числов 233. естественно никогда не выполнится условие. когда компилируешь - внимательно смотри в окно результата. там тебя компилятор наверняка предупредил о сравнении беззнакового числа со знаковым. ну или на худой конец учись дебажить. эту ошибку обнаружить очень просто - ставишь в начале файла свой байт и дебажишь первую же итерацию. зы: объявляй переменную unsigned char;
Столкнулся еще с такой проблемой на С++: есть массив из текста, например Code: dfdffghfgh<b>jisjgdfgidj</b>vjiuhgufdhg<b>sgdfg</b>jiosjfdds<b>oijsidjfisd</b> нужно как то отсортировать и вывести текст между тегами. Есть ли в с++ аналог функции preg_match_all для этих целей? Пробовал методом грубого перебора, но он занимает длительное время =/
Привет! Нужна помощь с этой программой на "C": Написать подпрограмму, реализующую динамический строку в виде структуры: struct array {char * string; /* ссылка на строку */ int size; /* размер строки */ }. Реализовать функции создания, удаления, конкатенации строк, а также обеспечить выборку подстрок и символов в указанной строке.
Доброго времени суток! Возник такой вопрос. В Visual Studio 2008 не рабоотает fseek (in, 0, 2). (на Си) То есть он как бы всё принимает и компилит, но в процессе выполнения вылетает ошибка stream!=NULL То есть как я понимаю он не может найти конец открываемого файла (в проге он открывает текстовый файлик). Самое главное, что в gcc всё в этом месте работало отлично...
VIP это не ошибка. это ассерт. проверь значение параметра in, реальный ли это файл. есть подозрение, что in = NULL...
Подскажите мoжно ли в Визул студии как-то при компиляции и запуске прописать *ARGV[], например мне надо отладить "asdf.exe data.txt" ?
В неком файле file.txt имееться данные следующего типа: , где Babyrka-фамилия охотника, 12-количество убитых животных, 300-вес убитых охотником животных Code: #include <stdio.h> #include <stdlib.h> typedef struct { char prizvishe[256]; int vpol; int vaga; } address; void main () { struct oxota { char prizvishe[256]; int vpol; int vaga;}; struct oxota oxota1; FILE*f; f=fopen("file.txt","w"); fscanf(f,"%s %i %i",oxota1.prizvishe,&oxota1.vpol,&oxota1.vaga); printf("\n Danue tablicu"); printf("\n ___________________________________________"); printf("\n Familiya oxotinka %c",oxota1.prizvishe); printf("\n Kilkistb vpolovanux tvarun %i",oxota1.vpol); printf("\n Zagalna vaga vsix tvarun %i",oxota1.vaga); fclose(f); } Как осуществить вывод данных с file.txt?