在将文件读入stl向量时删除\ r \ n

时间:2012-09-10 17:15:51

标签: c++ stl

我正在使用以下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或阅读后删除

2 个答案:

答案 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上,这是一个双字节序列,0x0A0x0D。如果您不想看到这两个字节,请在文本模式下打开流,即不要使用ios::binary。如果你这样做,你将获得单字符换行符。

请注意,文本文件中的'\ n'字符被写为与字符'\ r'和'\ n'对应的两个字节才是巧合。这些字符转义和写入的字节之间没有固有的联系,这就是我谨慎引用0x0A0x0D的原因。