我正在尝试为一个函数编写一个测试器,该函数将写入信息从一个文件一点一点地写入另一个文件。我很确定我的 BitOutputStream 类可以正常工作,因为下面的代码按预期打印出“A”。但是,当我将代码更改为下面的第二个版本时,该版本采用输入文件并写入输出文件,输入与输出不匹配。我不确定我是否无意中更改了我不应该更改的内容,或者输入文件具有某些“隐藏”字符,这些字符会导致不匹配或字节移位发生。我怀疑我可能没有正确使用 get() 。任何帮助将不胜感激。
/* 第一个(工作)版本 */
int main(int argc, char* argv[])
{
BitOutputStream bos(std::cout); // channel output to stdout
bos.writeBit(1);
bos.writeBit(0);
bos.writeBit(0);
bos.writeBit(0);
bos.writeBit(0);
bos.writeBit(0);
bos.writeBit(0);
bos.writeBit(1);
// prints an 'A' as expected
return 0;
}
/* 第二个(非工作)版本 */
int main(int argc, char* argv[])
{
std::string ifileName = std::string(argv[1]);
std::string ofileName = std::string(argv[2]);
ofstream ofile;
ifstream ifile;
if(ifile)
ifile.open(ifileName, ios::binary);
if(ofile)
ofile.open(ofileName, ios::binary);
BitOutputStream bos(ofile);
int i;
while (ifile.good()) {
i = bos.writeBit(ifile.get()); // could the error be due to incorrect usage of get()?
std::cout << i << std::endl; // just to see how many bits have been processed
}
bos.flush();
ifile.close();
ofile.close();
return i;
}
我打电话的第一个版本
./a.out
我打电话的第二个版本
./a.out input output
它将 1 2 3 打印到终端指示 writeBit 被调用了 3 次,但我预计它会被 'A' 调用 8 次,那么为什么只调用 3 次呢?
输入文件中只有“A”。在输入文件上调用 hexdump 生成:
0000000 0a41
0000002
在输出文件上调用 hexdump 生成:
0000000 0005
0000001
另外为什么 hexdump 在 0a-'linefeed' 和 41-'A' 之前生成 7 个 0,最后的 '0000002' 是什么意思?我可以在代码的第二个版本中更改什么,以便输入和输出的 hexdump 匹配?
编辑:这是 BitOutputStream 的声明/定义
#ifndef BITOUTPUTSTREAM_HPP
#define BITOUTPUTSTREAM_HPP
#include <iostream>
class BitOutputStream {
private:
char buf; // one byte buffer of bits
int nbits; // how many bits have been written to buf
std::ostream& out; // reference to the output stream to use
public:
/* Initialize a BitOutputStream that will
* use the given ostream for output.
* */
BitOutputStream(std::ostream& os) : out(os) {
buf = nbits = 0; // clear buffer and bit counter
}
/* Send the buffer to the output, and clear it */
void flush() {
out.put(buf);
buf = nbits = 0;
}
/* Write the least sig bit of arg into buffer */
int writeBit(int i) {
// If bit buffer is full, flush it.
if (nbits == 8)
flush();
int lb = i & 1; // extract the lowest bit
buf |= lb << nbits; // shift it nbits and put in in buf
// increment index
nbits++;
return nbits;
}
};
#endif // BITOUTPUTSTREAM_HPP