使用C++检测文件中空行的混淆行为

使用C++检测文件中空行的混淆行为,c++,C++,下面是我的文件数据的排列方式 10 12 19 21 3 11 18 25 2 9 1 3 1 0 5 0 2 1 2 当我使用GETLIN和ItTrimStudio逐行记录文件时,我要检测这两个数据块之间的空行。我需要检测它,而不是跳过它 所以我写了 while(getline(fp1,line)){ if(line.empty()){ cout<<"empty line"<<endl; } 它不起作用。我想这行可能是空的,但是包含了空白,所以我写了

下面是我的文件数据的排列方式

10 12 19 21 3
11 18 25 2 9

1 3 1
0 5 0
2 1 2

当我使用GETLIN和ItTrimStudio逐行记录文件时,我要检测这两个数据块之间的空行。我需要检测它,而不是跳过它

所以我写了

while(getline(fp1,line)){
 if(line.empty()){
 cout<<"empty line"<<endl;
}
它不起作用。我想这行可能是空的,但是包含了空白,所以我写了

    while(getline(fp1,line)){
 if(line == "\n"){
 cout<<"empty line"<<endl;
}
不工作。我甚至使用line.find_first_not_of“”==std::string::npos作为条件,仍然没有运气。 然后我想把这个空白打印出来,看看里面有什么。我打印了我的行的所有长度,发现空行的大小是1。于是我写了

if(line.length() == 1){
  cout<<hex<<  line;
  } 
我得到了一个空白行,没有任何东西

我很困惑。我应该怎么做来检测这一空行?
请帮忙

您可以创建一个bool变量isblank,将其设置为true,并在每次行输入后在while循环内迭代该行,无论该行是否为空:

std::ifstream in("test.txt");
std::string sLine;
bool isBlank = true;

while(std::getline(in, sLine)){
    isBlank = true;
    for(int i(0); i < sLine.length(); i++){
        if(!isspace(sLine[i])){
            isBlank = false;
            break;
        }
    }
    if(isBlank)
        std::cout << "Blank Line" << std:: endl;
    else
        std::cout << sLine << std::endl;
}

我认为附加字符可能是回车符\r或其他空白字符。请注意,std::hex不影响字符串或字符。要检查它是什么,请尝试:

cout<<hex<<  (int)line[0];

empty等于0大小,因此白线不是空的。显然,我发现它不是空的。如果你看这里,答案是可以接受的。打印行中每个字符的代码值。它可能是不可打印的,我不确定您期望Try cout isspace只检查空白。我打印出了它的ascii码,那一行只包含回车。我不知道为什么。。。新行可以仅包含空格,也可以是CR或两者结合使用?@user3431800回车符是空格字符之一。什么不清楚?呃。。。通常,空行表示它包含零个字符。你不应该只在空白处调用任何空白。谢谢。我查了一下,我怎么找到的,这是一个马车返回。我看到所有人都只检查空格字符。这里有很多帖子,包括我在原帖中提到的那篇,还有这篇。我仍然不知道空白行包含什么内容。它是否只包含空格或回车符,或者两者都包含?回车符是在与Windows兼容的编辑器中,在每个换行符之前\n添加的附加字符。只需将带有单个\r字符的行视为空行,您就可以了。包含单个空格的行并没有什么特殊,我也不会称之为“空白”。顺便说一句:在二进制模式和文本模式下打开文件时,windows对回车的处理方式不同。也许这就是你困惑的原因。检查:是的,这就是我要问的,关于系统如何处理无法打印的行。谢谢这对你来说应该很有趣:
cout<<hex<<  (int)line[0];