0

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

4

2 回答 2

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
于 2012-09-10T18:05:08.887 回答
1

在创建流对象时传递标志ios::binary告诉流对象在写入或从流中读取时不要翻译换行符或任何其他获得特殊编码的字符。因此,当您以二进制模式编写具有换行符的文件时,您将获得系统用于换行符的任何内容。在 Windows 上,这是一个两字节序列,0x0A, 0x0D. 如果您不想看到这两个字节,请以文本模式打开流,即不要使用ios::binary. 如果你这样做,你会得到单字符换行符。

请注意,文本文件中的“\n”字符被写为对应于字符“\r”和“\n”的两个字节只是巧合。这些字符转义和写入的字节之间没有内在联系,这就是为什么我小心引用0x0Aand的原因0x0D

于 2012-09-10T17:34:18.893 回答