如何测试空白:

how to test for white space c++:

本文关键字:空白 测试 何测试      更新时间:2023-10-16

我试图解析。csv文件,我需要能够测试回车。下面是一个名为sample.csv的测试.csv文件:

2
3

您将注意到,该文件中有两行和一列。我现在编写以下c++代码:

ifstream myfile (sample.csv); //Import file
char nextchar;
myfile.get(nextchar);
cout<<nextchar<<'n';
myfile.get(nextchar);
cout<< nextchar<<"   If 0, then that was not a carriage return. If 1, it was. :"<<(nextchar=='n')<<'n';
myfile.get(nextchar);
cout<<nextchar<<'n';

我希望得到以下输出:

2
   If 0, then that was not a carriage return. If 1, it was. :1
3
但是,我得到:
2
   If 0, then that was not a carriage return. If 1, it was. :0
3

这怎么可能?我如何测试回车??

可以是一对字符CR + LF。在任何情况下,您都可以自己输出该字符的代码。你为什么不这样做呢?也可以应用标头<cctype>

中声明的标准函数std::isspace

我建议使用标准函数std::getline来读取整行,而不是使用get。

在假设中有很多事情可能会出错:操作系统行为,用于编写示例文件的文本编辑器,行末不希望的额外空间或制表符,以及用于打开文件的ios_base::openmode,以及这些之间的所有可能的组合…

首先插入这一行,看看你实际读到的是什么:它是0x0d还是0x0a ?还是别的什么?

cout << "Char read: 0x0"<< std::hex << (int)nextchar<<"n"; 
cout << "If 0 ...          // Existing line 

你也可以用下面的东西代替你的样品。它以二进制模式打开文件,并以十六进制显示文件中的字符:

ifstream myfile ("sample.csv", ifstream::binary); //Import file
while (myfile.good() )  {
    char nextchar;
    myfile.get(nextchar);
    if (myfile.good())
        cout << "0x0"<< std::hex << (int)nextchar
                         << " " << (isprint(nextchar)? nextchar:'?') <<"n";
}

如果第二行和第三行分别是0x0d和0x0a,则可以确定文本编辑器添加了额外的CR。

那么您可以在上面的代码中删除ifstream::binary。通常应该有,正如您在第二行中指出的那样,只有0x0a。如果不是这样,那么您应该调查默认的openmode是否以某种方式被改变了。

顺便说一下,我已经在windows下编译了你的原始代码,并使用记事本准备了示例文件,运行程序得到了…如你所愿!然后我重新做了测试,并做了以下修改,最终得到了你得到的结果。