Автор Тема: Вопросы по С/С++  (Прочитано 21192 раз)

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Вопросы по С/С++
« : Октябрь 28, 2017, 01:43:42 pm »
Написал код для разбора файла формата:
{номер}{строка}

Пример

{100}{Hello!}

Код на С++

#ifndef _MSG_HPP
#define _MSG_HPP
/*******************************************************************************

*******************************************************************************/
class msg
{
public:
  msg(const string & name);
  ~msg();
  char read_char();
  bool read();
  const string & get();
  const string & str(const string & val);

private:
  size_t   m_line;
  size_t   m_tabs;
  string   m_buffer;
  ifstream m_input;
  map<string, string> m_data;
};
/*******************************************************************************

*******************************************************************************/
msg::msg(const string & name)
{
  m_input.open(name.c_str());
 
  m_line = 1;
  m_tabs = 0;
 
  while(read())
  {
    string f = get();
    read();
    string s = get();
    m_data.insert(pair<string, string>(f,s));
  }
 
  for (map<string,string>::iterator i = m_data.begin(); i != m_data.end(); ++i)
  {
    cout << i->first + " = " + i->second  << endl;
  }
}
/*******************************************************************************

*******************************************************************************/
msg::~msg()
{
  m_input.close();
}
/*******************************************************************************

*******************************************************************************/
char msg::read_char()
{
  char ch = m_input.get();
 
  m_tabs++;
 
  if (ch == '\n')
  {
    m_line++;
    m_tabs = 0;
  }
 
  return ch;
}
/*******************************************************************************

*******************************************************************************/
bool msg::read()
{
  m_buffer.clear();
 
  char ch = read_char();

  while ((ch == ' ') || (ch == '\n'))
  {
    ch = read_char();
  }

  if (ch == '{')
  {
    ch = read_char();

    while (ch != '}')
    {
      if (ch != '\n')
      {
        m_buffer.push_back(ch);
      }
      ch = read_char();
    }
  }
 
  if (ch == EOF)
  {
    return false;
  }
 
  return true;
}
/*******************************************************************************

*******************************************************************************/
const string & msg::get()
{
  return m_buffer;
}
/*******************************************************************************

*******************************************************************************/
const string & msg::str(const string & val)
{
  map<string, string>::iterator i = m_data.find(val);

  if (i == m_data.end())
  {
    return "Error: Not found string in " + val;
  }
  else
  {
    return i->second;
  }
}
/*******************************************************************************

*******************************************************************************/
#endif

Проблема в этой функции

const string & msg::str(const string & val)
{
  map<string, string>::iterator i = m_data.find(val);

  if (i == m_data.end())
  {
    return "Error: Not found string in " + val;
  }
  else
  {
    return i->second;
  }
}

Как вернуть second?

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Вопросы по С/С++
« Ответ #1 : Октябрь 28, 2017, 02:01:42 pm »
Разобрался.

Компилятор не на second ругался а на return с текстом, переделал.

const string & msg::str(const string & val)
{
  map<string, string>::iterator i = m_data.find(val);

  if (i == m_data.end())
  {
    m_buffer = "Error: Not foint string in " + val;
   
    return m_buffer;
  }
  else
  {
    return i->second;
  }
}

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Вопросы по С/С++
« Ответ #2 : Октябрь 30, 2017, 10:11:35 pm »
Разобрался.

Компилятор не на second ругался а на return с текстом, переделал.

const string & msg::str(const string & val)
{
  map<string, string>::iterator i = m_data.find(val);

  if (i == m_data.end())
  {
    m_buffer = "Error: Not foint string in " + val;
   
    return m_buffer;
  }
  else
  {
    return i->second;
  }
}
А ты осознаешь, что результат этой функции у тебя будет невалиден как только умрет переменная типа msg?
То есть:
const string& foo() {
  msg m("myfile.txt");
  const string& res = m.str("foobar");
}

int main() {
  cout << foo() << endl;
  return 0;
}
Не является верной программой. Тут чистый UB.
Y = λf.(λx.f (x x)) (λx.f (x x))

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Вопросы по С/С++
« Ответ #3 : Ноябрь 02, 2017, 06:52:36 pm »
Ляксей здаров! Как исправить, что бы без уб?

Получается сразу после конструктора вызывается деструктор?

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Вопросы по С/С++
« Ответ #4 : Ноябрь 02, 2017, 06:54:56 pm »
Ты же общую идею кода понял, кроме внесения проверок на ошибки что можно улучшить в коде? Код намеренно использует стандарт c++98 без auto и т.д