这是我的代码
应该将文件读入三个向量中并跳过空行,其中的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;
}
答案 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?。但是您已经被告知以前的问题。
请不要仅仅因为您对回答者不满意而多次询问相同的问题。编辑您的问题,以获得更好的答案。