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

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

Восстановить пароль Регистрация
 
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
17.10.2012, 23:58     Считывание команд из файла и их интерпретация #1
Приветствую! Нужен ваш на свет по поводу:
есть файл с командами вида
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")
Ну как-то так. Т.е. в конечном итоге вопрос заключается в том, как из строки считать значения, если их количество может отличаться.
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2012, 23:58     Считывание команд из файла и их интерпретация
Посмотрите здесь:

Считывание из файла C++
C++ считывание из файла
Считывание файла в массив и запись нового файла C++
считывание из файла C++
Заменить считывание с клавиатуры на считывание из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
18.10.2012, 06:06     Считывание команд из файла и их интерпретация #2
есть книжка С++ Практика использования и программирование. Страуструп Б. Вот там есть все необходимое для вашей задачи.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 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
5282 / 4801 / 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
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
18.10.2012, 13:28  [ТС]     Считывание команд из файла и их интерпретация #5
А нет способов попроще, без векторов? Мне не нужно формировать массив команд, мне нужно считать команду из строки, выполнить её и перейти к следующей. Может как-то проверять наличие следующего аргумента, или может считать строку и разделить её по количеству пробелов?
alsav22
5282 / 4801 / 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
5282 / 4801 / 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++ Чтение команд из файла

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

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

Текущее время: 02:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru