做毕设,下载了个227万数据量的数据集想要测一下算法性能,结果一读文件就出问题,看了一下std::stoull抛出异常,提示invalid parameter。用vim看了一下文件,每行数据以空格隔开,第一个数据就是字符串形式的整数,不应该参数非法。改成strtoull,返回值是0,这表示参数的第一个字符就不是0~9,很奇怪。用vim的命令:set invlist查看不可见字符,也没发现行首有什么字符,在代码里控制跳过第一条数据,发现程序正常运行,那么问题就定位到数据文件头了。在代码中打出第一行的字符串长度,发现比我看到的要多出三个字符的长度,上网搜了一下,发现是文件头BOM导致的。
解决方法:
使用sed替换掉BOM:cat IN_FILE | sed ‘s/\xef\xbb\xbf//g’ > OUT_FILE
警醒:如果不是因为我的程序在文件每行初始就拿来转换为整形,那几乎不可能发现这一问题,后续算法运行可能效果会有所不同。往后如果有需要用到网上下载下来的数据,那么应该先检查一下文件头是否含有BOM,有的话需要去掉后再使用。