使用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];