我正在尝试制作一个压缩程序,例如写入常规的8位(char)只有1或2位,取决于我们试图编写的char。我试着写:
//I dont know what the function should return
char getBytes(char c)
{
return 0xff;
}
ofstream fout;
fout.open("file.bin", ios::binary | ios::out);
fout << getBytes(c);
但到目前为止,我只写了一些字符。 那我该怎么写呢?&#39; 01&#39;?或只是&#39; 1&#39;?我应该用什么函数写入只有字节的文件?感谢。
答案 0 :(得分:1)
Streams是字节序列。没有标准接口来写单个位。如果要编写单个位,则需要创建自己的基于流构建的位流的抽象。它会将多个位聚合成一个字节,然后写入底层流。如果你想要合理有效的写入,你可能需要在将它们写入流之前聚合多个字节。
天真的实现看起来像这样:
int main() {
std::ofstream file(“bits.txt”, std::ios_base::binary);
bitstream out(file);
out << false << true << false << false
<< false << false << false << true;
}
请注意,此实现对最后一个字节进行了相当基本的处理:如果一个字节被启动,它将按原样写入。这是否是预期的行为,或者是否需要移位以使写入的位在最后一个字节的最高位中取决于事物的使用方式。此外,对于无法写入基础流的情况,没有错误处理。 (并且代码是未经测试的 - 我没有一种简单的方法可以在我的手机上编译)
你可以使用这样的类:
A
除非我搞砸了,否则上面的代码应该将bits.txt
写入文件A
(Sub clean_data()
Sheets("Reason data").Range("H:Z").Replace 0, ""
Call delete_blanks
End Sub
Sub delete_blanks()
Sheets("Reason data").Range("H:Z").SpecialCells(xlCellTypeBlanks).Delete (xlToLeft)
Call move_data
End Sub
Sub move_data()
'Copies reason data and pastes it into data worksheet
Sheets("Reason data").Range("A3:K3", Sheets("Reason data").Range("A3:F3").End(xlDown)).Cut _
Sheets("Data").Range("A1").End(xlDown).Offset(1)
End Sub
的ASCII代码为65)。
仅用于上下文:文件实际上被组织成字节块。但是,流抽象会聚合写入块的各个字节。尽管面向字节的接口是由所有流行的操作系统提供的,但是编写任何数据块往往效率都很低。