我正在使用以下C ++ stl构造将文件读入vector of characters
std::ifstream testFile(inFileName, std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), std::istreambuf_iterator<char>());
但是这也将\r\n
读入矢量。
有没有办法避免阅读\r\n
或阅读后删除
答案 0 :(得分:4)
假设您输入的文件是在您正在阅读的同一平台上生成的 然后,只需在文本模式下打开文件,即可将LTS(在本例中看起来像'\ r \ n')转换为'\ n':
std::ifstream testFile(inFileName);
您可以使用remove_copy
算法删除特定字符:
std::vector<char> fileContents;
// Copy all elements that are not '\n'
std::remove_copy(std::istreambuf_iterator<char>(testFile), // src begin
std::istreambuf_iterator<char>(), // src end
std::back_inserter(fileContents), // dst begin
'\n'); // element to remove
如果您需要删除多种类型的角色,则需要创建仿函数并使用remove_copy_if
算法:
struct DelNLorCR
{
bool operator()(char x) const {return x=='\n' || x=='\r';}
};
std::remove_copy_if(std::istreambuf_iterator<char>(testFile), // src begin
std::istreambuf_iterator<char>(), // src end
std::back_inserter(fileContents), // dst begin
DelNLorCR()); // functor describing bad characters
答案 1 :(得分:1)
创建流对象时传递标志ios::binary
告诉流对象在写入流或从流中读取时不转换换行符或任何其他获得特殊编码的字符。因此,当您编写一个在二进制模式下具有换行符的文件时,您将获得系统用于换行符的任何内容。在Windows上,这是一个双字节序列,0x0A
,0x0D
。如果您不想看到这两个字节,请在文本模式下打开流,即不要使用ios::binary
。如果你这样做,你将获得单字符换行符。
请注意,文本文件中的'\ n'字符被写为与字符'\ r'和'\ n'对应的两个字节才是巧合。这些字符转义和写入的字节之间没有固有的联系,这就是我谨慎引用0x0A
和0x0D
的原因。