当一行仅包含制表符时,处理制表符描述的文本文件

时间:2016-08-26 02:36:57

标签: c++

我正在处理标签描述的文本文件。我使用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);
        }
    }
}

2 个答案:

答案 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)