我正在尝试使用 C++ 编写一个程序,在字符串和字符之间执行 XOR 操作。结果存储在一个文件中,稍后再读回。XOR 操作的某些输出导致字符成为控制字符,如 SOH、ACK、STX、BEL。然后,这些控制字符会阻止程序继续运行,因此它只会将 XOR 操作输出的一半写入或读取到文件中。我尝试使用 ios::binary 模式来避免这种情况发生,但问题仍然存在。有没有其他方法可以强行避免控制字符操作?
问问题
39 次
1 回答
0
是的,不管任何控制字符,它都可以简单地存储。请使用流的未格式化的 IO 函数。请在此处和此处阅读有关未格式化的 io 函数的信息。因此,例如put、write或get和read。
以二进制或文本模式打开文件基本上不会对您的应用程序产生影响。请在此处阅读有关模式的差异。
有了上面的知识,这个功能就很容易实现了。
请参见:
#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 回答