Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
#1

Считывание команд из файла и их интерпретация - C++

17.10.2012, 23:58. Просмотров 976. Ответов 7
Метки нет (Все метки)

Приветствую! Нужен ваш на свет по поводу:
есть файл с командами вида
cmd_1 arg_1
cmd_2 arg_1 arg_2
cmd_3 arg_1 arg_2 [arg_3]
т.е. есть 3 класса команд - с 1 аргументом, с 2 аргументами и 3 с переменным количеством аргументов (либо 2, либо 3). Вопрос - как через <fstream> реализовать считывание этих команд? Причём считывание аргументов происходит в раздельные переменные. Пример
new abc //Вызов функции new("abc")
new abc 1 //Вызов другой функции, например newElem("abc", "1")
diff abc abd //Вызов функции diff("abc", "abd")
diff abc abd res //А тут, допустим, вызовется ф-ция diff_add("abc", "abd")
Ну как-то так. Т.е. в конечном итоге вопрос заключается в том, как из строки считать значения, если их количество может отличаться.
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
18.10.2012, 06:06     Считывание команд из файла и их интерпретация #2
есть книжка С++ Практика использования и программирование. Страуструп Б. Вот там есть все необходимое для вашей задачи.
igorrr37
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
18.10.2012, 09:11     Считывание команд из файла и их интерпретация #3
самый простой способ - считать строку, положить ее в свой поток и считать оттуда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
 
int main()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::string s;
        std::stringstream ss;
        std::vector<std::string> v;
        while(std::getline(ifs, s))
        {
            ss.str(s);
            while(ss >> s)
            {
                v.push_back(s);
            }
            for(auto const& val : v)
            {
                std::cout << val << " _ ";
            }
            std::cout << std::endl;
            v.clear();
            ss.clear();
        }
        ifs.close();
    }
    else std::cerr << "Unable to open file" << std::endl;
    return 0;
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 10:11     Считывание команд из файла и их интерпретация #4
Может неправильно понял что нужно, но если значения в строке - это слова, разделённые одним пробелом, то этот код считает слова в строке в вектор строк, т.е., в каждом таком векторе, первый элемент - это имя команды, каждый следующий элемент - имена аргументов. Каждый такой вектор, помещается в вектор векторов. Каждый элемент такого вектора - это строка из файла.
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
 
int main()
{
    
    fstream f("1.txt");
    
    if (!f.is_open()) cout << "Error!" << endl;
    else
    {
        vector <vector <string> > vvec;
    
        string str;
        while (!f.eof())
        {
            getline(f, str);
    
            vector <string> vstr;
            int ind = 0;
            for (int i = 0; i < str.size(); i++)
            {
                string temp;
            
                ind = str.find(' ', i);
                if (ind == -1) temp.assign(str, i, str.size() - i);
                else temp.assign(str, i, ind - i);
                vstr.push_back(temp);
                if (ind == -1) break;
                i = ind;
            }
            vvec.push_back(vstr);
        }
        f.close();
 
        for (int i = 0; i < vvec.size(); i++)
        {
            for (int j = 0; j < vvec[i].size(); j++)
                cout << vvec[i][j] << " ";
            cout << endl;
        }
    }
    
   
   cout << endl;
   system ("pause");
   return 0;
}

Или так, попроще:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
 
int main()
{
    ifstream f("1.txt");
    if (!f.is_open()) cout << "Error!" << endl;
    else
    {
        vector <vector <string> > vvec;
    
        while (!f.eof())
        {
            vector <string> vstr;
            string temp;
            char ch;
            do
            {
                f.get(ch);
                if (ch != ' ' && ch != '\n') temp.push_back(ch);
                else 
                {
                    vstr.push_back(temp);
                    temp.clear();
                }
                 
            } while (ch != '\n' && !f.eof());
            
            vvec.push_back(vstr);
        }
        f.close();
 
        for (int i = 0; i < vvec.size(); i++)
        {
            for (int j = 0; j < vvec[i].size(); j++)
                cout << vvec[i][j] << " ";
            cout << endl;
        }
    }
    
   cout << endl;
   system ("pause");
   return 0;
}
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
18.10.2012, 13:28  [ТС]     Считывание команд из файла и их интерпретация #5
А нет способов попроще, без векторов? Мне не нужно формировать массив команд, мне нужно считать команду из строки, выполнить её и перейти к следующей. Может как-то проверять наличие следующего аргумента, или может считать строку и разделить её по количеству пробелов?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 19:01     Считывание команд из файла и их интерпретация #6
Как строку делить на слова при считывании я показал. Как потом использовать отдельные слова, это уже ваше дело. Додумайте. Сейчас просто времени нет, переделывать.

Добавлено через 5 часов 17 минут
Цитата Сообщение от iRomul Посмотреть сообщение
А нет способов попроще, без векторов?
Вектор хорош тем, что сам подгонит свой размер под количество считанных слов.
Цитата Сообщение от iRomul Посмотреть сообщение
мне нужно считать команду из строки, выполнить её и перейти к следующей
Как вариант.
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
 
int main()
{
    ifstream f("1.txt");
    if (!f.is_open()) cout << "Error!" << endl;
    else
    {
        while (!f.eof())
        {
            vector <string> vstr; // здесь будет считанная строка
            string temp; // здесь будет считанное слово
            char ch; // здесь будет считанный символ
            do
            {
                f.get(ch); // читаем символ
                if (ch != ' ' && ch != '\n' && !f.eof()) 
                    temp.push_back(ch); // если символ не пробел, и не конец строки, и не конец файла
                else 
                {
                    if (!temp.empty()) // если считано полностью слово и оно не пустое, то помещаем слово в вектор
                        vstr.push_back(temp); 
                    temp.clear();
                }
                 
            } while (ch != '\n' && !f.eof()); // читаем символы до конца строки или до конца файла
            if (!vstr.empty()) // если в векторе есть строка
            {
            //здесь, в векторе vstr, находится считанная строка (каждый элемент - слово). 
            // Первый элемент - имя команды, следующие элементы - аргументы.
            // В этом месте можно использовать для выполнения команды
            
            for (int i = 0; i < vstr.size(); i++) // вывод содержимого вектора на экран (для демонстрации).
                cout << vstr[i] << " ";
            cout << endl;
            }
            
        }
        f.close();
    }
    
   system ("pause");
   return 0;
}
Миниатюры
Считывание команд из файла и их интерпретация  
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 22:45     Считывание команд из файла и их интерпретация #7
Добавлю. Если string не подходит и нужно, чтобы была строка в стиле С (массив char с '\0' в конце), то можно использовать метод c_str, который вернёт такую строку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2012, 13:05     Считывание команд из файла и их интерпретация
Еще ссылки по теме:
C++ Считывание с файла
C++ Считывание из файла
Считывание из файла C++
Считывание с файла C++
Считывание из файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
19.10.2012, 13:05  [ТС]     Считывание команд из файла и их интерпретация #8
Спасибо большое за код и особенно за комментарии! Попробую под свою задачу адаптировать
Yandex
Объявления
19.10.2012, 13:05     Считывание команд из файла и их интерпретация
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru