首页 > 解决方案 > 如何阻止 fstream 消耗字符转义?

问题描述

我正在编辑一个文件,并附加到它。我"在某个地方有一个我试图保留转义字符的地方。由于此代码编写其他代码,然后将其编译。

#define EDIT_FILE fstream::out | fstream::binary | fstream::in | fstream::ate
#define REWRITE_FILE fstream::out | fstream::binary | fstream::in | fstream::trunc

fstream *fileStream  = new fstream("path/to/file", REWRITE_FILE);
//  add some text to file. Then open again for edits.
fileStream->close();
fileStream->open("path/to/file", EDIT_FILE);
*filestream << "\\\\\"";

我试过改变斜线的数量,但没有运气。我尝试删除fstream::out,建议的其他答案应该可以工作,而这只是导致程序在尝试写入文件时崩溃。我应该使用哪种标志组合附加到文件末尾,同时保留转义字符?

标签: c++escapingfstream

解决方案


你需要像原始字符串文字这样的东西吗?

#include <fstream>

int main() {
    std::fstream file("test.txt", std::ios::out);
    if(file) {
        file<<R"f(\\\\\")f";
    }
}

然后产生

\\\\\"

可以使用语法创建原始字符串文字R"delimiter(raw_characters)delimiter"。在上述情况下,f用作分隔符。它们专门用于避免字符转义。需要注意的一项是分隔符不应出现在原始字符中。

编辑:

根据要求,采用二进制路径的一种方法是直接写入字符的 ASCII 值,无需转义它们,如下所示(无错误检查!):

#include <fstream>
#include <vector>

namespace {
    char BACK_SLASH = 92; //ASCII for '\'
    char QUOTE = 34; //ASCII for '"'
}

int main() {
    std::fstream file("test.bin", std::ios::binary|std::ios::out);
    if(file) {
        std::vector<char> str(10, BACK_SLASH);
        str.push_back(QUOTE);
        file.write(str.data(), str.size());
        file.put('\n');
    }
}

产生_

\\\\\\\\\\"

如果一个人想避免逃避角色,这可能是我能想到的方法之一,但好吧……这很丑陋。


推荐阅读