如何将功能组合到主要的C ++程序中

时间:2018-11-10 06:42:03

标签: c++

这是我的代码

应该将文件读入三个向量中并跳过空行,其中的bool函数用于检查行是否为空。如果为空,则防止主体中的代码读取它。所以我的问题是,如何摆脱单独的布尔函数并将其组合到int main中?我希望所有内容都在int main内部。谢谢。

#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <fstream>
using namespace std;

// check if the string is empty i.e it only consists of
// whitespace characters only
bool empty(string s) {
    for (int i = 0; i < s.length(); i++) {
        if (!(s[i] == ' ' || s[i] == '\t' || s[i] == '\n')) return false;
    }
    return true;
}

int main() {
    ifstream objFile;
    string inputName;
    string outputName;
    string header;
    cout << "Enter image file name: ";
    cin >> inputName;
    objFile.open(inputName);
    string name;
    vector<string> name2;
    string description;
    vector<string> description2;
    string initialLocation;
    vector<string> initialLocation2;
    string line;


    if (objFile) {
        while (!objFile.eof()) {
            line = "";
            // Skip past empty lines
            while (!objFile.eof() && empty(line))
                getline(objFile, line);
            name = line;
            name2.push_back(name);
            line = "";
            // Skip past empty lines
            while (!objFile.eof() && empty(line))
                getline(objFile, line);
            description = line;
            description2.push_back(description);
            line = "";
            // Skip past empty lines
            while (!objFile.eof() && empty(line))
                getline(objFile, line);
            initialLocation = line;
            initialLocation2.push_back(initialLocation);

        }
    }
    else {
        cout << "not working" << endl;
    }

    for (std::vector<string>::const_iterator i = name2.begin(); i != name2.end(); ++i)
        std::cout << *i << ' ';
    std::cout << endl;
    for (std::vector<string>::const_iterator i = description2.begin(); i != description2.end(); ++i)
        std::cout << *i << ' ';
    std::cout << endl;
    for (std::vector<string>::const_iterator i = initialLocation2.begin(); i != initialLocation2.end(); ++i)
        std::cout << *i << ' ';
    std::cout << endl;
}

2 个答案:

答案 0 :(得分:2)

只需使用Standard Library (STL)就可以解决您对冗余函数empty()的使用:

编辑:正如评论中指出的那样,应该检查一下字符串中是否存在唯一的空格及其长度...感谢@Enfyve指出{{ 3}} ...

代替此:

if (empty(line)) { /*...*/ }

if (std::all_of(line.begin(), line.end(), isspace)) { /*...*/ }

或:

if (std::find_if(line.begin(), line.end(), [](char const ch)
    { return !isspace(ch); }) == line.end()) { /*...*/ }

或:

if (std::count_if(line.begin(), line.end(), [](char const ch)
    { return !isspace(ch); }) == 0) { /*...*/ }

您有很多选择可以做到... 不要再发明轮子了!

答案 1 :(得分:0)

  

如何摆脱单独的布尔函数并将其合并到int main中?

通过实现main()中的功能来“摆脱”该功能。

另请参见Why is iostream::eof inside a loop condition considered wrong?。但是您已经被告知以前的问题。

请不要仅仅因为您对回答者不满意而多次询问相同的问题。编辑您的问题,以获得更好的答案。