Автор Тема: Програмирование на C++  (Прочитано 76716 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #420 : 16 Июнь 2011, 05:26:11 »
Цитата
HoRRoR,нет, слово app слишком вошло в обиход (в виде сокращения от application) и найти ответ было сложно. Спасибо за ответ.
А кто ищет подобные слова по отдельности, не уточняя контекст? Достаточно написать в запросе C++ ios app.

Цитата
Будет выведено всё без переводов строки? Ведь символьная переменная вполне может принимать значение \n так в чём же проблема?
Открой в бинарном режиме.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #421 : 16 Июнь 2011, 14:34:05 »
Цитата: HoRRoR
Открой в бинарном режиме.
int main()
{
    ifstream file;
    file.open("test.txt", ios::binary);
    if(!file)
     exit(100500);
    char c;
    while(file>>c)
     cout<<c;
    file.close();
    return 0;
}
Всё равно всё в ряд пишет без пробелов и переводов строк.

Добавлено позже:
И ещё хотел спросить
    string a="test string";
    const char *b=a.data();
Получается при вызове строка.data() создаётся массив указателей с содержимым как у строки (это я выгуглил), но зачем его сделали обязательно const тогда? Всё равно это ведь копия, которая потом никак не влияет на оригинал.

Добавлено позже:
И ещё вопрос N3:
А записать в файл целый класс можно лишь приводя тип к символьному?
ofstream outCredit("credit.dat", ios::binary);
...
     outCredit.write(reinterpret_cast<const char*> (&blankClient),
                     sizeof(ClientData));
...

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #422 : 16 Июнь 2011, 16:32:36 »
int main()
{
    ifstream file;
    file.open("test.txt", ios::binary);
    if(!file)
     exit(100500);
    char c;
    while(file>>c)
     cout<<c;
    file.close();
    return 0;
}
Всё равно всё в ряд пишет без пробелов и переводов строк.
Ты все строки загоняешь в одну переменную?
Тогда почему  должны быть пробелы и переводы строк? o_0
Походу работает вот так.

содержимое текстового файла:
один
два
три

while(file>>c)
после ввода в переменную получаем:c="одиндватри";
« Последнее редактирование: 16 Июнь 2011, 16:37:11 от Mr2 »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #423 : 16 Июнь 2011, 16:50:16 »
Цитата
Всё равно всё в ряд пишет без пробелов и переводов строк.
Значит специфика ">>". Используй get().

Цитата
Получается при вызове строка.data() создаётся массив указателей с содержимым как у строки (это я выгуглил), но зачем его сделали обязательно const тогда? Всё равно это ведь копия, которая потом никак не влияет на оригинал.
Каких ещё указателей? Создаётся копия строки и даётся на неё указатель, копия действительна до следующего вызова функции. const - потому что это данные объекта класса, принцип инкапсуляции.

Цитата
А записать в файл целый класс можно лишь приводя тип к символьному?
Глупый вопрос. Тип параметра при передаче в функцию должен быть совместим с принимаемым типом. Поэтому, если принимается указатель на char, то должно быть явное преобразование. Если принимался бы указатель на void - можно было бы обойтись без него, т.к. указатель бы сам неявно преобразовался к void*.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #424 : 16 Июнь 2011, 18:59:37 »
Цитата: Mr2
Ты все строки загоняешь в одну переменную?Тогда почему  должны быть пробелы и переводы строк?
А почему их должно не быть когда я поочерёдно считывают содержимое в c ?
Цитата: HoRRoR
Значит специфика ">>". Используй get().
Сменив на while(file.get(c)) теперь выводятся и пробелы с переводами строки.

Добавлено позже:
По поводу режимов открытия файлов:
fstream outCredit("credit.dat",ios::in|ios::out|ios::binary);
Чего всюду или было ||, а здесь оно | ? Это же не логично да и вообще было бы логичнее чтобы режимы открытия файлов нужно было перечислять через запятую.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #425 : 16 Июнь 2011, 19:29:47 »
Цитата
Чего всюду или было ||, а здесь оно | ? Это же не логично да и вообще было бы логичнее чтобы режимы открытия файлов нужно было перечислять через запятую.
Вот ты читал учебники, столько спрашивал, столько писал, а толку мало - не знаешь даже основ.
| - побитовое "или", || - логическое, то же самое касается & и &&. А с запятой вообще глупо - это в каких-нибудь интерпретируемых языках можно сделать, где не важна ресурсоёмкость и производительность.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #426 : 16 Июнь 2011, 19:33:00 »
Цитата: HoRRoR
| - побитовое "или"
Первый раз слышу, ни в курсе с++ универа ни в Дейтеле не было ни слова о таком  :) Единственное что было побитовое так это сдвиг .

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #427 : 19 Июнь 2011, 00:12:10 »
До конца не понимаю некоторые фичи по работа с файлами. Вот например у Дейтела есть некая программка, я приведу только одну строчку:
readFromFile.read( reinterpret_cast< char * >( &client ), sizeof( ClientData ) );
Что мы здесь делаем? Как я понимаю мы считываем в объект client данные из файла readFromFile размера sizeof( ClientData ) байт. А вот что вот это значит уже при чтении данных reinterpret_cast< char * >( &client )? Обратное преобразование из char * в данные типа ClientData ? Данные до этого были преобразованы из ClientData в указатель на char и записаны.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #428 : 20 Июнь 2011, 22:45:13 »
ОМГ, тупо читаем данные по адресу client, предварительно приведя указатель к char* без каких-либо проверок (они тут не нужны).

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #429 : 20 Июнь 2011, 23:19:23 »
HoRRoR,а читаем куда?
Вот полностью одна из функций из примера Дейтела
// update balance in record
void updateRecord( fstream &updateFile )
{
   // obtain number of account to update
   int accountNumber = getAccount( "Enter account to update" );

   // move file-position pointer to correct record in file
   updateFile.seekg( ( accountNumber - 1 ) * sizeof( ClientData ) );

   // read first record from file
   ClientData client;
   updateFile.read( reinterpret_cast< char * >( &client ),
      sizeof( ClientData ) );

   // update record
   if ( client.getAccountNumber() != 0 )
   {
      outputLine( cout, client ); // display the record

      // request user to specify transaction
      cout << "\nEnter charge (+) or payment (-): ";
      double transaction; // charge or payment
      cin >> transaction;

      // update record balance
      double oldBalance = client.getBalance();
      client.setBalance( oldBalance + transaction );
      outputLine( cout, client ); // display the record

      // move file-position pointer to correct record in file
      updateFile.seekp( ( accountNumber - 1 ) * sizeof( ClientData ) );

      // write updated record over old record in file
      updateFile.write( reinterpret_cast< const char * >( &client ),
         sizeof( ClientData ) );
   } // end if
   else // display error if account does not exist
      cerr << "Account #" << accountNumber
         << " has no information." << endl;
} // end function updateRecord


Добавлено позже:
Почему после этого
   updateFile.read( reinterpret_cast< char * >( &client ),
      sizeof( ClientData ) );
Файл client перестаёт уже быть по умолчанию и в нём появляются данные считанные из файла, мы ведь нигде ему ничего не присваивали.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #430 : 21 Июнь 2011, 16:16:00 »
Цитата
HoRRoR,а читаем куда?
Ну ты прикалуешься? Читаем из файла в память по адресу client.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #431 : 21 Июнь 2011, 16:23:59 »
Цитата: gepar
Что мы здесь делаем? Как я понимаю мы считываем в объект client данные из файла readFromFile размера sizeof( ClientData ) байт.
Цитата: HoRRoR
ОМГ, тупо читаем данные по адресу client, предварительно приведя указатель к char*
Цитата: HoRRoR
Ну ты прикалуешься? Читаем из файла в память по адресу client.
Это ты мне кажется прикалываешься  :) Ну да теперь точно понятно что оно делает, ато я прошлые выводы делал из наблюдений только. Дейтел только не закончил что-то описывать всё по поводу чтения из файла, он указал что можно как-то хитро полиморфно писать файлы и их идентификаторы (чтобы потом при чтении из файла можно было определить какого именно пользовательского типа этот файл), но не написал как это делать  :( Ну да ладно, дочитаю что там у него дальше по работе со строкам, а потом нагуглю уже на тему сохранения файлов информацию, тем более что у меня осталось куча вопросов прямо сейчас. Например как произвести переименование файла? Первое что можно придумать это создать новый файл с нужным именем и скопировав туда данные из старого удалить старый. Но это подойдёт лишь для вариантов с маленькими файлами, да и не правильно это, HoRRoR,подскажи пожалуйста как последнее реализовать, ато сейчас любопытно  :)

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #432 : 21 Июнь 2011, 17:24:37 »
Цитата
Это ты мне кажется прикалываешься
Из контекста ясно, что мы читаем их из файла. Никаких обратных преобразований там в помине нет.

Цитата
подскажи пожалуйста как последнее реализовать, ато сейчас любопытно
rename().

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #433 : 21 Июнь 2011, 23:35:06 »
HoRRoR, а можно как-то понятнее.  Я вижу функция меняет название строк, как же её применить в этом случае:
int main()
{
    ofstream test("abc.txt", ios::out);
    rename("abc.txt","xyz.txt");
    return 0;
}
Так ведь как я написал она не работает же. А, я уже понял почему, файл надо закрывать перед переименованием же.


Тот пример что там вообще мне не понятен
/* rename example */
#include <stdio.h>

int main ()
{
  int result;
  char oldname[] ="oldname.txt";
  char newname[] ="newname.txt";
  result= rename( oldname , newname );
  if ( result == 0 )
    puts ( "File successfully renamed" );
  else
    perror( "Error renaming file" );
  return 0;
}
В первую очередь мне непонятно почему если у меня нет файла oldname.txt то мне пишет: Error renaming file: No such file or directory. Откуда взялись две точки и строка No such file or directory, их же нету в коде при ошибки чтения файла  :?

Добавлено позже:
Глупо только что эта rename возвращает 1 в случае не удачи, приходиться тогда помнить что возвращает 0 при неудаче, а что 1. Нет чтобы сделать чтобы любая функция возвращала при неудаче 0.

Добавлено позже:
Ну и ещё тогда вопрос: какие функции есть для копирования и удаления файла?  :)

Добавлено позже:
Просто ведь
    std::ofstream a("abc.txt",std::ios::app);
    std::ofstream b("cde.txt",std::ios::out);
    b=a;
Я смотрю сделать тут нельзя, конструктора копирования для файлов нет, а жаль, помоему ничто не должно было мешать сделать и логично было бы  :)

Добавлено позже:
Ах да, и ещё вопрос: что уходит на вывод когда мы отправляем файл на печать? какой-то 16ричный адрес я смотрю, но адрес чего это?

Добавлено позже:
И ещё один вопрос (много что-то их у меня сегодня  :blush: ):
какая конструкция является оптимальной когда надо провести цикл с условиями (if) и если условие за весь цикл так ни разу и не выполнилось то тогда выдать сообщение об ошибке (в виде сообщения в cerr например) ? Я делаю по принципу
bool переменная_для_проверки_выполнения_условия=true;
for()
{
if()
 {
 ...
 bool переменная=false;
 }
}

if (bool переменная)
cerr<<Ошибка
А есть ли другая какая конструкция более удобная?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #434 : 27 Июнь 2011, 20:40:16 »
Немогу разобраться с записью в файл данных созданного класса  :-\
Собственно вот я пишу всё это в файл trans.dat
int main()
{
    fstream file("trans.dat",ios::in|ios::binary|ios::out);
    if (!file)
    {
        cerr<<"Error";
        return 100500;
    }
    ClientData client1,client2,client3;
    client1.setID(1).setName("Abba").setBalance(2.34);
    client2.setID(2).setName("Baab").setBalance(-2.3);
    cout<<client1<<client2;
    file.write(reinterpret_cast<const char*>(&client1),sizeof(ClientData));
    file.write(reinterpret_cast<const char*>(&client2),sizeof(ClientData));
    file.seekg(0);
    file.read(reinterpret_cast<char*>(&client3),sizeof(ClientData));
    cout<<client3;
}
По выводу программы (данные client3) видно что запись в файл была успешна и считывание тоже прошло удачно так как в обьекте client3 появились данные считанные из начала файла trans.dat, тоесть были считаны данные такие же как у client1. Файл trans.dat при просмотре через текстовый редактор тоже показывает что данные есть.

Далее я убираю код по записи файла и хочу всего лишь считать данные в client3 и вывести их на печать
#include <iostream>
#include <fstream>
#include "ClientData.h"
 
using namespace std;
 
int main()
{
    fstream file("trans.dat",ios::in|ios::binary|ios::out);
    if (!file)
    {
        cerr<<"Error";
        return 100500;
    }
    ClientData client1,client2,client3;
//    client1.setID(1).setName("Abba").setBalance(2.34);
//    client2.setID(2).setName("Baab").setBalance(-2.3);
//    cout<<client1<<client2;
//    file.write(reinterpret_cast<const char*>(&client1),sizeof(ClientData));
//    file.write(reinterpret_cast<const char*>(&client2),sizeof(ClientData));
    file.seekg(0);
    file.read(reinterpret_cast<char*>(&client3),sizeof(ClientData));
    cout<<client3;
}
И я тут же получаю ошибку, второй день матерюсь и не могу понять где я совершаю ошибку при чтении файла. Что я не так делаю подскажите пожалуйста. В прикреплённом файле помимо этого main и код самого класса ClientData.

Добавлено позже:
Пробовал открывать второй раз файл только для чтения - получал ту же ошибку так что не знаю где я накосячил или может что не правильно понял по считыванию данных, собственно из-за этого же не могу сделать в другой программе нормальное чтение и распечатку данных из файла.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #435 : 28 Июнь 2011, 13:36:57 »
Проблема с классом ClientData решена, не надо было строку использовать для хранения данных, теперь работает когда сделал символьный массив. Тем не менее почему так? sizeof возвращает ведь тот же размер что для пустрой строки, что для строки с данными ... правда sizeof то делает это на этапе компиляции. В общем надо отказаться от использования строк в классах, данные которые планируется сохранять в бинарный файл с возможностью мгновенного доступа к любой записи из файла.
« Последнее редактирование: 28 Июнь 2011, 14:02:14 от gepar »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #436 : 03 Июль 2011, 21:16:39 »
Не могу разобраться с записью объекта созданного мною класса в файл, видать мой класс для этого до конца не подходит (с каждым запуском скомпилированной версии программы пишутся в файл разные символы, точнее первый символ тот же, а остальные - меняются каждый раз ). У меня у моего класса есть 3 поля данных: номер, имя и баланс, так вот номер я так понимаю сейвит в файл оно нормально (вот это и есть тот первый символ при просмотре текстовым редактором что не меняется), а вот имя и баланс перекручиваются почему-то. Помогите добиться полной статичности класса чтобы каждый раз при его записи данные при просмотре текстовым редактором были одинаковые, ато когда оно каждый раз по новому получается то я потом дальше не могу считать данные корректно.

ClientData.h (Заголовочный файл к классу)
#ifndef CLIENTDATA_H
#define CLIENTDATA_H

#include <string>
using std::string;


class ClientData
{
public:
    //конструктор по умолчанию который устанавливает
    //номер =0, имя = пустой строке и баланс =0
    ClientData(int=0,string="",double=0.0);

    void setID(int);
    int getID() const;

    void setName(string);
    string getName() const;

    void setBalance(double);
    double getBalance() const;


private:
    int ID; //номер
    char name[15]; //имя
    double balance; // баланс
};

#endif

ClientData.cpp (реализация самого класса)
#include <string>
using std::string;

#include <cstring>
#include "ClientData.h"

ClientData::ClientData(int i, string n, double b)
{
    setID(i);
    setName(n);
    setBalance(b);
}

void ClientData:: setID(int i)
{
    ID=i;
}

int ClientData:: getID() const
{
    return ID;
}

void ClientData:: setName(string n)
{
    const char* lname=n.data();
    int length=n.size();
    length=(length<15 ? length : 14);
    strncpy(name,lname,length);
    name[length]='\0';
}

string ClientData:: getName() const
{
    string ret(name);
    return ret;
}

void ClientData:: setBalance(double b)
{
    balance=b;
}

double ClientData:: getBalance() const
{
    return balance;
}

main(совершаю только запись в файл 10 объектов типа ClientData
#include <iostream>
#include <iomanip>
#include <fstream>
#include "ClientData.h"
using namespace std;
 
void newRecord(fstream&);
int menu();
void print(fstream&);
void print2(fstream&);
 
int main()
{
    //создаю объект типа ClientData
    ClientData client;
   
    //открываю файл для чтения и записи в бинарном режиме
    fstream file("trans.dat",ios::binary|ios::in|ios::out);
    if (!file)
     cerr<<"Error";
 
    //записываю 10 моих объектов в файл
    for (int i=0;i<10;i++)
     file.write(reinterpret_cast<const char*>(&client),sizeof(ClientData));
}
Пробовал писать на программерских форумах - что-то не могут они подсказать в этом вопросе ...

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #437 : 30 Июль 2011, 16:18:46 »
Продолжаю изучать с++, некоторые вещи в с++ вовсе нелогичные и работают через задницу (хотя по сути это отсалось от си). Вот как можно было додуматься сделать так чтобы стандартная функция toupper для конвертации букв в ВЕРХНИЙ РЕГИСТР возвращала код символа в  виде числа int, ну это же вообще не логично, ну ни капельки же.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #438 : 31 Июль 2011, 08:52:50 »
Функция принимает и возвращает код символа, почему он должен быть именно в char?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #439 : 02 Август 2011, 10:49:42 »
HoRRoR,ну разве сложно было выбрать возвращаемый тип char, какраз бы обратная конвертация из int и пошла бы и вернулся бы готовый символ, а так приходится при её использовании использовать ещё конвертацию в char.
А вообще я тут переписывал некоторые стандартные функции и на одном шаге столкнулся с непонятной мне проблемой:
void *memmove(void *s1, const void *s2, size_t n)
{
    char *s11=(char*)s1;
    char *temp=new char [n+1];
    char *s22=(char*)s2;
    strncpy(temp,s22,n);
    //cout<<"TEST: "<<temp<<endl;
 
    //здесь в цикле почему-то убирается по  первому символу за цикл
    //у каждой переменной, те у temp убирается "abc", а у s11 "sim".
    // почему так? Я же хотел только скопировать "abc" в строку s11
    // вместо sim
    for (size_t i=0;i<n;i++)
    {
        *(s11++)=*(temp++);
 
    }
    return s11;
}
Я то потом банально использовал предыдущую свою функцию для копирования
void *memcpy(void *s1, const void *s2, size_t n)
{
    char *s11=(char*)s1;
    char *s22=(char*)s2;
    for (size_t i=0;i<n;i++)
    {
        *s11++=*s22++;
    }
    return s11;
}

void *memmove(void *s1, const void *s2, size_t n)
{
    char *s11=(char*)s1;
    char *temp=new char [n+1];
    char *s22=(char*)s2;
    memcpy(temp,s22,n);
    memcpy(s11,temp,n);
    return s11;
}
Но мне всё равно интересно откуда брался в предыдущей реализации "сдвиг", может кто знает?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #440 : 20 Октябрь 2011, 19:21:02 »
Начал изучать WinApi и что-то совсем он мне не по нраву  :(

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #441 : 20 Октябрь 2011, 22:44:39 »
Попробуй Qt, например.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #442 : 20 Октябрь 2011, 23:02:51 »
HoRRoR,не могу, у меня WinApi + MFC + Matlab + программирование под линукс (ну хоть тут без интерфейсов, но взаимодействия всякие между процесами есть)+ Visual UML + VBA (вообще не знаю когда его учить, он для меня совсем не знаком)+ Системное программирование и всё до НГ, нет времени для экспериментов в эти пол года. Ну и ещё предметы всякие есть не относящиеся к it, но я перечислять их уж не буду.
В WinApi в первую очередь напрягает что даже для вывода текста функции хитрые типа TextOut, дык мало ещё просто вывести текст а чтобы понять как он будет отображаться нужно хитрые расчёты связанные с шрифтом и его размерностями (через поля TEXTMETRIC). Ещё не нравится что практически все функции сделаны на все случаи жизни поэтому принимают по 25 параметров, о хитрых структурах по 40 полей я вообще молчу. В общем на данный момент выглядит мне оно совершенно новым и не знакомым, от с++ только синтаксис остался да операторы циклов.

Добавлено позже:
Ещё добавлю что ошибки сложно искать так как самому их найти почти не реально как начинающему, а на русских форумах по WinAPi только тему создаёшь так сразу и жди ответа дня 3 и то не факт что кто-то ответит (это я пока задаю элементарные вопросы с простенькими примерами из Петзольда), притом что по консольному с++ ответы писали буквально через 5 минут.

Добавлено позже:
В тему с++ ещё: http://liveworkspace.org/ - сайт онлайн компилятор. Просто цацка так как всё довольно простенько, windows.h там конечно не подключить, ввод в поток тоже на работает (компилятор его попросту пропускает), но что-то не сложное можно запустить. Библиотека stl там присутствует если что.

Добавлено позже:
HoRRoR,а ты сам WinApi изучал?

Оффлайн ColaKid

  • Пользователь
  • Сообщений: 365
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #443 : 20 Июль 2012, 19:27:08 »
Потихоньку знакомлюсь с WinApi. Кто-нибудь может подсказать, как задать приложению иконку? Я имею в виду не ту, которая на панели задач, а иконку самого файла, ту, что отображается в проводнике. Среда Visual Studio 2010.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #444 : 20 Июль 2012, 19:30:40 »
ColaKid, ну так нужно же проассоциировать файл со своей программой через запись в реестр, там же указать иконку. Ато тебе прям для всего функции winapi подавай, их и так вон дофига накопилось :)
В MFC кстати чуть попроще: при создании проекта тип файла для твоего приложения указываешь и оно само проассоциирует, иконку только какую-то от студии левую прилепит, но зато не требует от тебя никаких телодвижений.

Оффлайн ColaKid

  • Пользователь
  • Сообщений: 365
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #445 : 20 Июль 2012, 19:34:23 »
gepar, ты, наверное, рассказываешь, как ассоциировать с приложением какой-то тип данных, наподобие как .doc открывается в word?
А я спрашиваю, как самому экзешнику задать иконку.  :)

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #446 : 10 Февраль 2013, 23:56:14 »
Что сейчас наиболее актуальное для изучения?
Думаю начать с консольных приложений в VS2008EE.
Использовать какие-то учебники, или просто документацию? Слишком уж много всего, а что выбирать не ясно.
Есть ли вообще некая 'оффициальная' документация или всё это варьируется в зависимости от студий и кому как захотелось, ну и желательно конечно переведённая на русский.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #447 : 11 Февраль 2013, 00:08:48 »
Ti_, с++ это не железяка какая-то, его не по документациям обычно изучают :)
Цитата: Ti_
Что сейчас наиболее актуальное для изучения?

Ээээ, ну с++x11, те версия за 2011 год. Есть ещё QT, boost и т.д. , но сначала нужно изучить сам с++, а далше можешь что-то почитать на нём базирующееся.

Цитата: Ti_
Думаю начать с консольных приложений в VS2008EE.

Нет разницы какая студия, разве что 2008ая не поддерживает некоторые фичи c++x11, но их так немного что можешь начать с неё ну или скачай сразу vs2012 express, она по ресурсам не больше требует чем 2008 (разве что она на XP не встанет если у тебя не 7ка).

Цитата: Ti_
Использовать какие-то учебники, или просто документацию? Слишком уж много всего, а что выбирать не ясно.

Учебников и правда много. Если с англ. хорошо то C++x11 Страуструпа там вроде уже должна была выйти (я не проверял), а нет так почитай что-то более старое, а с особенностями последних редакций с++ ознакомишься потом. Я лично начинал с книги Дейтелов, но это реально книга для начинающих которые никогда не программировали на языках высокого уровня, если есть время то можешь начать с этой книги - она хорошая, но большая.

Цитата: Ti_
Есть ли вообще некая 'оффициальная' документация или всё это варьируется в зависимости от студий и кому как захотелось, ну и желательно конечно переведённая на русский.

Да, есть оф. стандарт с++ если ты это имеешь в виду под документацией. Студия это лишь ide, стандарт на с++ один и распространяется на компиляторы, а не на ide. Вообще если хочешь просто в чистом виде статьи по с++ то на msdn есть это всё, там где-то есть что-то типа "начните изучать с++" ссылка и оно тебе сразу выкинет пачку статей для начинающих. Но на русском там не все они так что лучше по книге какой-то разбираться.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #448 : 11 Февраль 2013, 00:15:41 »
Ti_, с++ это не железяка какая-то, его не по документациям обычно изучают :)
Ну,  некоторые товарищи пишут, что как раз использовали справочник + гугл,  а  ни какие-то там книжки и самоучители.
Вот собственно что это за справочник. Некий programmers reference manual ?

Добавлено позже:
Ээээ, ну с++x11, те версия за 2011 год. Есть ещё QT, boost и т.д. , но сначала нужно изучить сам с++, а далше можешь что-то по
Немного не точно выразился, имел ввиду что наиболее актуальное сейчас из документаций.
« Последнее редактирование: 11 Февраль 2013, 00:22:28 от Ti_ »

Оффлайн ColaKid

  • Пользователь
  • Сообщений: 365
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #449 : 11 Февраль 2013, 00:21:48 »
Нет разницы какая студия, разве что 2008ая не поддерживает некоторые фичи c++x11
Даже последняя не всё поддерживает. Так что нет разницы какую ставить, ну и именно 2008 нет смысла ставить. 2010 или 2012 тогда уж. Но начинать всё равно нужно со стандарта 2003 года, ибо в новом без знания "классики" не разобраться. А там, глядишь, и компиляторы подтянутся.