223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,507
1

Ввод данных из файла для тестирования работоспособности программы

08.12.2017, 17:02. Показов 1035. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет! Не могу решить задачу из Книги Страуструпа. Собственно сама задача.

Кликните здесь для просмотра всего текста
Добавьте в калькулятор из главы 7 команду from х. осуществляющую ввод данных из файла х. Добавьте в калькулятор команду to у. выполняющую вывод (как обычных данных, так и сообщений об ошибках) в файл у. Напишите набор тестов, основанных на идеях из раздела 7 .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
34
35
36
37
38
39
#include "std_lib_facilities.h"
#include <fstream>
 
bool is_declared(string s);
 
//Создаём лексему
struct Token {
    char kind;
    double value;
    string name;
 
    Token(char ch) :kind(ch), value(0) { }
    Token(char ch, double val) :kind(ch), value(val) { }
    Token(char ch, string n): kind(ch), name(n) { }
};
 
//Поток ввода 
class Token_stream {
    bool full;
    Token buffer;
    //fstream fio;   //Хотел создать объект для работы с файлами   
    //bool file;
public:
    Token_stream():full(false), buffer(0), fio(" ", ios_base::in | ios_base::out), file(false) { }
 
    Token get();
    void putback(Token t) { buffer = t; full = true; }
    //double in_from_file();   
    //double out_from_file();
    void ignore(char);
};
 
//Структура для переменных
struct Variable {
    string name;
    double value;
    bool flag;
    Variable(string n, double v, bool b) :name(n), value(v), flag(b) { }
};


Кликните здесь для просмотра всего текста
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//const char let = 'L';    
//const char let_c = 'C';  //t.kind == let_c значит, что объявляется константная перемная
const char quit = 'q';   //t.kind == quit означает выход
const char print = ';';  //t.kind == print означает печать
const char number = '8'; //t.kind == number означает число
const char name = 'a';   //t.kind == name означает переменная
 
const char Input = 'F';    //t.kind == Input означает вывод из файла
const char Output = 'T';
const string declkey = "let";
const string declkey1 = "let_c";
const string inkey = "from"; //команда указывающая на вывод из файла
const string outkey = "to";
 
//Основная функция ввода симолов и превращение их лексемы
Token Token_stream::get()
{
    if (full) { full=false; return buffer; }
    char ch;
 
    if(file && !fio.eof())
    {
        fio >> ch;
        cout << ch;
    }
    if(!file)
        cin >> ch;
    switch (ch) {
    case '(': case ')': case '+': case '-': case '*': case '/': case '%': case ';': case '=': case 'q': case ',':
        return Token(ch);
        
    case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
    {   cin.putback(ch);
        double val;
        cin >> val;
        return Token(number,val);
    }
    default:
        if(isalpha(ch)) {
            string s;
            s += ch;
            while(cin.get(ch) && (isalpha(ch) || isdigit(ch))) s += ch;
 
            cin.putback(ch);
            if (s == declkey) return Token(let);
            if(s == declkey1) return Token(let_c); //для именованной константной переменной
            if (s == "exit") return Token(quit);
            if(s == outkey) return Token(Output);
            if(s == inkey) 
            {
                cin >> ch;
                s = ch;
                while(cin.get(ch) && (isalnum(ch) || ch == '.'))
                    s += ch;
                cin.putback(ch);
                //fio.open(s.c_str(), ios_base::in);
                return Token(Input, s);
            }
 
            return Token(name,s);
        }
        
        error("Bad token");
    }
}
 
//...........
//Возможно как-то так, где-то нужно объект связывать с файлом, пока ничего лучше не придумал
double Token_stream::in_from_file()
{
    if(ts.buffer.kind != Input)
        error("error");
    
    string name = ts.buffer.name;
    fio.clear();
    fio.open(name.c_str(), ios_base::in);
    if(!fio)
        error("File for Input could be not opened");
    file = true;
    
    double d = expression();
    return d;
}


Как в функции get() , указать, что читать нужно из файла, а не из потока cin? По аналогии с "from" делать команду "to", так?

Ход мысли такой: Считывая символы из потока, в случает, если присутствует команда "from" считать имя файла, затем создать лексему, после этого, в функции in_from_file(), связать имя файла с объектом fio указав при этом, что данный объект будет считывать данные из файла, file = true. Затем в функции get() как-то обозначить, что теперь данные читаются из файла, через объект fio. Я сделал проверку, if(file) { fio >> ch; } else if(!file) { cin >> ch; } но как-то меня терзают смутные сомнения, тогда нужно будет, что-то подобное проделать и для команды "to", которая должна вывести данные в файл...
А что если я захочу создать команду "from file_x.txt to file_y.txt" Это не требуется, но мало ли.

Спасибо, заранее!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2017, 17:02
Ответы с готовыми решениями:

Как сделать запись данных из файла в массив по условию для программы тестирования?
Здравствуйте, появилась идея создать свой &quot;тестер&quot;. В связи с этим появилось несколько вопросов,...

Переделать ввод программы для получения данных из текстового файла.
Надеюсь кто то поймет задание. Есть программа и ее нужно модифицировать таким образом, чтобы...

Загрузка данных для тестирования из файла
Делаю тестирование знаний по Русскому языку, так вот столкнулся с проблемой: Есть две...

Ввод/вывод данных программы из файла
Приветствую. Как банально можно сделать ввод чисел с запятой в массив из файла? А так же запись...

0
08.12.2017, 17:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2017, 17:02
Помогаю со студенческими работами здесь

Программы для проверки работоспособности сканера
Добрый день! Подскажите пожалуйста программы и утилиты, которые диагностируют работоспособность...

Ввод из файла данных для массива структур
Структура WORKER содержит следующие поля: -фамилия и инициалы работника; -название занимаемой...

Каких данных достаточно для выявления работоспособности DVD привода?
Вопрос скорее к тем кто имеет непосредственное отношение к экспертизам. Мне постоянно приходится...

Хранение в массиве данных программы тестирования
Не выходит создать массив, в котором будет храниться информация: вопрос и варианты...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru