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

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

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

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

17.10.2012, 23:58. Просмотров 1044. Ответов 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")
Ну как-то так. Т.е. в конечном итоге вопрос заключается в том, как из строки считать значения, если их количество может отличаться.
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2012, 23:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание команд из файла и их интерпретация (C++):

Считывание команд из файла - C++
На входном файле: число в первой строке максимальный размер стека, на последующих команды (push a и pop, где a - значение которое нужно...

Заменить считывание с клавиатуры на считывание из файла - C++
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Чтение команд из файла - C++
Есть файл в нем могут быть комманды:Add 30, Ads 5, End, Equ, Tos. Ads 5 - создаём контейнер. Add 30 - добавляем в контейнер 30 Так...

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Считывание с файла - C++
#Oblast1 g;ergtr hwtrh rt h trh ert h hry e #Oblast2 oooooooqwe qweeeeeeeeee qweeeeeeeee #Oblast3 3333333333

считывание с файла - C++
помогите, пожалуйста, нужно считать с файла ряд целых чисел и переписать его куда-то чтобы потом можно было сделать с ним операции

7
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
18.10.2012, 06:06 #2
есть книжка С++ Практика использования и программирование. Страуструп Б. Вот там есть все необходимое для вашей задачи.
0
igorrr37
1647 / 1275 / 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;
}
0
alsav22
5421 / 4816 / 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;
}
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
18.10.2012, 13:28  [ТС] #5
А нет способов попроще, без векторов? Мне не нужно формировать массив команд, мне нужно считать команду из строки, выполнить её и перейти к следующей. Может как-то проверять наличие следующего аргумента, или может считать строку и разделить её по количеству пробелов?
0
alsav22
5421 / 4816 / 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;
}
0
Миниатюры
Считывание команд из файла и их интерпретация  
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 22:45 #7
Добавлю. Если string не подходит и нужно, чтобы была строка в стиле С (массив char с '\0' в конце), то можно использовать метод c_str, который вернёт такую строку.
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
19.10.2012, 13:05  [ТС] #8
Спасибо большое за код и особенно за комментарии! Попробую под свою задачу адаптировать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2012, 13:05
Привет! Вот еще темы с ответами:

Считывание из файла - C++
Всем привет! Есть вот такая проблема: при считывании данных из файла в объект ниоткуда берутся лишние данные. В чем может быть проблема?...

Считывание из файла - C++
Ребят, помогите, пожалуйста, новичку разобраться=) Есть файл, в котором расположена информация примерно такого содержания 1946 12 30 0...

считывание из файла c++ - C++
считываю из файла, но он не читает все строки, почему не знаю. Может кто-нибудь помочь? ifstream file(&quot;1.txt&quot;,ios::in); char...

Считывание с файла - C++
ВСЕМ ПРИВЕТ!Я пишу программу смысл ее такой: создан файл key.txt(в этом файле написано 1234) при запуске программы она нам покажет если в...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
19.10.2012, 13:05
Ответ Создать тему
Опции темы

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