Oberon space
General Category => Общий раздел => Тема начата: Jordan от Октябрь 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?
-
Разобрался.
Компилятор не на 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;
}
}
-
Разобрался.
Компилятор не на 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.
-
Ляксей здаров! Как исправить, что бы без уб?
Получается сразу после конструктора вызывается деструктор?
-
Ты же общую идею кода понял, кроме внесения проверок на ошибки что можно улучшить в коде? Код намеренно использует стандарт c++98 без auto и т.д