【问题标题】:Function Call That Checks For Input Correctness From Text File - C++从文本文件检查输入正确性的函数调用 - C++
【发布时间】:2017-10-03 01:26:12
【问题描述】:

如果“INSERT_EMPLOYEE”下面的数据足以输入到我的“insertEmployee”函数中,我该如何检查文本文件? (例如:正确的数量、参数类型或检查参数边界)另外,如果输入的格式无效,我不想执行该操作,而是直接跳到下一个操作。

我的文本文件:

INSERT_EMPLOYEE
12345
John
Smith
60000
35

INSERT_EMPLOYEE
Chris
Evans
70000

INSERT_EMPLOYEE
34567
Michael
Carter
50500
25

PRINT_ROSTER

我的 main.cpp:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    int id, salary, hours;
    employeeList list = employeeList();
    string line, firstName, lastName;

    ifstream employeeFile;
    employeeFile.open("employeeFile.txt");
    while(getline(employeeFile, line)) {
        if (line == "INSERT_EMPLOYEE") {
            employeeFile >> id >> firstName >> lastName >> salary >> hours;
            list.insertEmployee(id, firstName, lastName, salary, hours);
        }
        if (line == "PRINT_ROSTER") {
            list.printRoster();
        }
    employeeFile.close();
    return 0;
}

【问题讨论】:

  • 您可以通过使用std::getline() 并自己验证输入来做到这一点。 &gt;&gt; 格式化的输入提取运算符在输入有效时工作得很好。如果不是这样,你手上就会有一大堆难以解开的烂摊子。因此,如果需要输入验证,请不要使用&gt;&gt;。故事结束。
  • @SamVarshavchik 这很有道理,谢谢!
  • 语法注释:“输入到我的“insertEmployee”函数中?”。尝试更正式的“通过值传递给 insertEmployee() 函数”,或者通过引用传递,或者可能是“发送到 insertEmployee() 函数”或者选择适当时态的同义词:放入、加载、插入;键入、键入in,输入;代码,存储。“输入”是对您的代码尚未完成的事情的过去时态描述。

标签: c++ ifstream


【解决方案1】:

当您想根据语法解析/验证输入时,请考虑使用解析器。

不过,编写解析器很乏味。所以考虑使用解析器生成器。由于您正在编写 C++,因此请考虑使用动态编译的程序,例如使用 Boost Spirit:

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_match.hpp>
#include <iostream>
#include <fstream>

namespace qi = boost::spirit::qi;

struct Employee {
    unsigned id;
    std::string firstname, surname;
    double salary;
    unsigned hours;
};

static inline std::ostream& operator<<(std::ostream& os, Employee const& emp) {
    return os << "Employee (" 
        << emp.id << " " 
        << emp.firstname << " " 
        << emp.surname << " " 
        << emp.salary << " " 
        << emp.hours << ")";
}

struct employeeList {
    std::vector<Employee> employees;

    void printRoster() const {
        std::cout << "\nRoster:\n";
        for (auto& emp : employees)
            std::cout << emp << "\n";
    }
};

namespace parser {
    using namespace boost::spirit::qi;
    auto const INSERT = copy(uint_ >> eol >> +graph >> eol >> +graph >> eol >> double_ >> eol >> uint_);
}

int main() {
    employeeList list = employeeList();
    std::string line, firstName, lastName;

    std::ifstream input("employeeFile.txt");
    input.unsetf(std::ios::skipws);

    std::string command;
    while (getline(input, command)) {
        if (command == "INSERT_EMPLOYEE") {
            Employee emp;

            if (input >> qi::phrase_match(parser::INSERT, qi::blank, emp.id, emp.firstname, emp.surname, emp.salary, emp.hours)) {
                std::cout << "Added " << emp << "\n";
                list.employees.push_back(emp);
            }
            else {
                std::cout << "Ignoring invalid INSERT_EMPLOYEE command\n";
                input.clear();
                input.ignore(1024, '\n');
            }
        }
        if (command == "PRINT_ROSTER") {
            list.printRoster();
        }

        // skip any non-valid lines until empty line
        while (getline(input, command)) {
            if (command.empty())
                break;
            //else std::cout << "Skipping over input '" << command << "'\n";
        }
    }
}

对于给定的样本输入,它会打印:

Added Employee (12345 John Smith 60000 35)
Ignoring invalid INSERT_EMPLOYEE command
Added Employee (34567 Michael Carter 50500 25)

Roster:
Employee (12345 John Smith 60000 35)
Employee (34567 Michael Carter 50500 25)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多