我正在处理标签描述的文本文件。我使用getline来获取每一行,然后根据选项卡解析它并放入一个数组中供以后操作。偶尔,由于数据被输入到文本文件中,我有一个空行或者更常见的是除了ascii标签之外什么都没有的行。虽然我可以并且确实回去手动修复文件,
我已经完成了尝试让我的程序处理数据的任务。使用substr.empty()我可以处理空行并成功忽略行,这就是我想要做的。一行中的选项卡使得该行不为空,这是我得到的,并导致我的substr.empty通过错误。使用substr.begin我可以处理标签,但不要忽略带标签的行。相反,我只是通过一个错误并将错误输出到输出文件,让我知道我有一个错误。
我似乎无法让两种功能共存。我确信我缺少一些基本的东西。我一直试图弄清楚自己一个多月都无济于事(我不是每天都要编程)。所以我正在寻找为什么我不能将.begin作为一个或者boolean与if语句的空函数一起抛出。为什么我不能让.begin忽略这些行。
这是我的代码:
ofstream file_;
ifstream file2_("forecasttest.txt");
if (file2_.is_open())
while (file2_.good()) {
string substr;
getline(file2_, substr);
string::iterator substr2 = substr.begin();
//if (*substr2 == '\t') {
// file_.open("chaz_file.txt");
// if (file_.is_open())
// file_ << "you have bad data - a line that starts with a tab" << endl;
// file_.close();
// return 0;
//}
Input_Rows++;
if (substr.empty()) { //|| (*substr2 == '\t')
Input_Rows--;
}
else {
istringstream iss(substr);
cout << substr << endl;
string token;
while (getline(iss, token, '\t')){
vec_Forecast_Data_.push_back(token);
}
}
}
答案 0 :(得分:0)
您的代码似乎“想要”(而不是“说”)来执行以下操作:
如果该行为空或仅有标签,请记录错误,跳过该行并继续咀嚼输入
如果这就是你想要的,那么检测空(仅限空格/制表符)可能会带有如下函数:
bool checkAllSpacesLine(const std::string& s) {
size_t p, len=s.length(); // decrementing p will underflow to
// greater than len once it reaches 0
for(p=len-1; p<len && isspace(s[p]);p--);
return p>len; // p underflow, all chars were spaces
}
答案 1 :(得分:0)
使用此方法检查substr
是否为空或仅包含标签:
if (substr.find_first_not_of('\t') == std::string::npos)