0

我正在尝试使用 C++ 编写一个程序,在字符串和字符之间执行 XOR 操作。结果存储在一个文件中,稍后再读回。XOR 操作的某些输出导致字符成为控制字符,如 SOH、ACK、STX、BEL。然后,这些控制字符会阻止程序继续运行,因此它只会将 XOR 操作输出的一半写入或读取到文件中。我尝试使用 ios::binary 模式来避免这种情况发生,但问题仍然存在。有没有其他方法可以强行避免控制字符操作?

4

1 回答 1

0

是的,不管任何控制字符,它都可以简单地存储。请使用流的未格式化的 IO 函数。请在此处此处阅读有关未格式化的 io 函数的信息。因此,例如putwritegetread

以二进制或文本模式打开文件基本上不会对您的应用程序产生影响。请在此处阅读有关模式的差异。

有了上面的知识,这个功能就很容易实现了。

请参见:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

// Show string as characters and as a sequence of the related codes
void output(const std::string& title, std::string& s) {

    std::cout << std::left << '\n' << title << '\n';
    // Show all characters of the string
    for (const char c : s)
        std::cout << std::setw(4) << c;
    std::cout << "\n" << std::dec;
    // Show integer equivalent of all chars
    for (const char c : s)
        std::cout << std::setw(4) << static_cast<unsigned int>(static_cast<unsigned char>(c));
    std::cout << "\n";
    // Show integer equivalent of all chars
    for (const char c : s)
        std::cout << std::hex << std::setw(4) << static_cast<unsigned int>(static_cast<unsigned char>(c));
    std::cout << "\n\n";

}

int main() {

    // The test string
    std::string hello{ "Hello world" };
    output("Original String", hello);

    // Flip all bits
    for (char& c : hello) c ^= 255;
    output("Xored String", hello);

    // Here we will store the data
    const std::string filename{ "r:\\test.bin" };

    // Open file for binary output
    std::ofstream ofs(filename, std::ios::binary);

    // Check, if it could be opened
    if (ofs) {

        // Save all data
        for (char& c : hello)
            ofs.put(c);

        ofs.close();

        // Clear all data in hello
        hello.clear();
        output("Empty hello", hello);

        // Now open file for input
        std::ifstream ifs(filename, std::ios::binary);

        // Check, if it could be opened
        if (ifs) {
            
            // Read all data from file
            char k;
            while (ifs.get(k))
                hello += k;

            output("hello, read back from file", hello);

            // Flip all bits
            for (char& c : hello) c ^= 255;
            output("Xored String", hello);
        }
        else std::cerr << "\nError: Could not open file '" << filename << "'for input\n";
    }
    else std::cerr << "\nError: Could not open file '" << filename << "'for output\n";
}
于 2022-02-27T11:14:09.907 回答