[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. rudvil

    rudvil Elder - Старейшина

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    2Grek мешать С++ с Си не хорошо
    Code:
    #include <iostream>
    #include <locale>
    #include <fstream>
    #include <string>
    
    struct user {
      std::string name;
      std::string nick;
      std::string email;
      int icq;
    };
    
    int main(int argc, char* argv[]) {
      std::setlocale(LC_ALL, "Russian");
    
      user userdata;
    
      std::cout << "Введите имя\n";
      std::cin >> userdata.name;
    
      std::cout << "Введите ник\n";
      std::cin >> userdata.nick;
    
      std::cout << "Введите Email\n";
      std::cin >> userdata.email;
    
      std::cout << "Введите icq\n";
      std::cin >> userdata.icq;
    
      std::ofstream file("C:\\user.txt");
    
      file << "name:" << userdata.name << "\n";
      file << "nick:" << userdata.nick << "\n";
      file << "email:" << userdata.email << "\n";
      file << "icq:" << userdata.icq;
    
      file.close();
      system("pause");
    }
    
    вот так точно будет работать.
     
    1 person likes this.
  2. Grek

    Grek New Member

    Joined:
    19 May 2010
    Messages:
    18
    Likes Received:
    2
    Reputations:
    0
    учебники просто разные,сборная CCCP ))

    Спасиб всем.Разобрался почуть.
     
  3. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Grek
    ну и в довесок - не юзай using namespace std. если хочется упростить - делай

    Code:
    using std::cin;
    using std::cout;
    using std::string;
    using std::ofstream;
    юзанье всего неймспейса - моветон.
     
  4. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Сори за глупый вопрос, но почему using namespace std нехорошо?
     
  5. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    потому что могут перекрыться классы в неймспейсах, например будет класс string из stl, и класс string от стороннего поставщика с гораздо большим функционалом, например в неймспейсе megalib. Если заюзить неймспесы std и megalib будет конфликт. Так же если вы не заюзали стд, а заюзали megalib, то при использовании объявления string наверняка большинство будет думать о классе стринг из std. То же самое будет и с самим разработчиком через некоторое время. То есть теперь надо будет думать, а откуда этот класс взят. Ну и плюс все что объявлно в неймспейсе становится видимо глобально. Поэтому и не рекомендуют так делать.

    И да, все юзинги писать надо в cpp файлах, а не в хидерах.
     
  6. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Все понятно.Спасибо.
     
  7. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Code:
    recv(s, response, 1024, 0);
    Этим кодом я получаю 1024 байта и записываю их в response.
    Как получить абсолютно всю информацию, предварительно не зная сколько байтов, и записать все это в один массив символов?

    Code:
    do
    {
     iResult = recv(s, response, 1024, 0);
    }
    while(iResult > 0);
    
    Этим кодом получается вся информация, но проблема в том, что в response оказываются последние 1024 байта, что очевидно. Необходимо как-то создать буфер неизвестной длины, и в цикле делать конкатенацию буфера вместе с полученной инфой, но как?

    Еще как вариант - создать динамический массив, и в цикле расширять его размер, опять вопрос - как?

    Спасибо заранее.
     
  8. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Code:
    string answer;
    
    while( (iResult = recv(s, response, 1024, 0)) > 0)
      answer.append(response, iResult);
    
    //весь ответ в answer.c_str()
    
    Если нуллбайты будут в ответе, то такой способ скорее всего не подойдет.
     
    #5348 d_x, 17 Jun 2010
    Last edited: 17 Jun 2010
  9. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Храни строки в списке, а не в массиве. Например, принимаешь по 1024 символа.

    Собственно список - это и есть какое-то подобие динамического массива.

    Тогда кодишь так:
    Code:
    struct info
    {
      info * next; // Указатель на след. элемент
      info * prev; // и на предыдущий
      char data[1024];
    } node;
    
    ...
    
    recv(s, node.data, 1024, 0);
    
    /*
     В классе хранишь указатели на первую принятую строку. Далее раотаешь с объектом.
    */
    
    ...
     
    Далее можно написать класс, реализующий линейный двусвязный список, нафигачить ему конструкторы копирования всякие, перегрузку выражений и т.д.
     
  10. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Посоветуйте какую нить приблуду для парсинга XML и ini. Желательно чтобы обвертки поменьше катать нужно было.
     
  11. .::f-duck::.

    .::f-duck::. Member

    Joined:
    30 May 2009
    Messages:
    343
    Likes Received:
    32
    Reputations:
    7
    Code:
    #include <iostream>
    #include <cstdlib>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    int main()
    {
    	setlocale(0, "Rus");
    	int option;
    
    	do
    	{
    		cout << "1.Hello, World" << endl;
    		cout << "2." << endl;
    		cout << "3.Quit" << endl;
    		cin >> option;
    		switch (option)
    		{
    			case 1:
    				cout << "Hello,World!" << endl;
    				break;
    				break;
    			case 2:
    				break;
    			case 3: 
    				break;
    			default :
    				cout << "o_O";
    				continue;
    		}
    	} while (option != 3);
    	return 0;
    }
    
    Code:
    			case 1:
    				cout << "Hello,World!" << endl;
    				break;
    				break;
     
    Вот этот участок. Можно как-то по элегантнее сделать?
    ЗЫ.Это онли пример ;)
     
  12. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Зачем два оператора break; ??? Что именно нужно сделать элегантнее??
     
  13. .::f-duck::.

    .::f-duck::. Member

    Joined:
    30 May 2009
    Messages:
    343
    Likes Received:
    32
    Reputations:
    7
    herfleisch,запусти с 1 оператором и введи 1,потом с двумя операторами и введи 1.
     
  14. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Запустил, разницы нету. Компилятор g++, ос Ubuntu 10.04

    Что именно поэлегантнее требуется?
     
    #5354 herfleisch, 18 Jun 2010
    Last edited: 18 Jun 2010
  15. .::f-duck::.

    .::f-duck::. Member

    Joined:
    30 May 2009
    Messages:
    343
    Likes Received:
    32
    Reputations:
    7
    herfleisch,прошу прощения,это где-то я глюкнул. Сейчас все ок.
     
  16. nitx

    nitx Elder - Старейшина

    Joined:
    4 Jan 2008
    Messages:
    214
    Likes Received:
    31
    Reputations:
    10
    там смысла во втором брэйке нету. Без него элегантнее уже никак не сделать.
    Хотя можно вместо брейка вобще написать return 0; но это уже дело вкуса. Хотя нас учили, много ретернов в коде лучше не делать, так как их искать потом при дебаге сложно (.
     
  17. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    да я уж знаю, что смысла нету. Если парень использует visual studio - то там таких глюков просто куча... Неудивительно, что он вставил второй брейк. Я на первом курсе университета тоже вставлял)))
     
  18. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    оидн break для switch'a, второй - для цикла. Почему нету смысла?
     
  19. Getty

    Getty Banned

    Joined:
    17 Jun 2010
    Messages:
    104
    Likes Received:
    1
    Reputations:
    0
    Ну,например,есть переменная:

    int one = 1000;

    Как вывести,скажем, 2 член?
    Было бы это char, то cout << one[2];
     
  20. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Потому что после первого break; второй break; будет пропущен. Он вообще никогда не выполнится.
     
    1 person likes this.
Thread Status:
Not open for further replies.