我们已经为系统编程分配了一个ASCII压缩项目,而我的代码中只有一行很难。
我问了question有关压缩的问题,并在纸上处理了示例文件的前十二个字母后,将数组代码适应了程序。在ddd中,packed[]
数组的值是我在纸上得出的值,但是没有将这些值写入文件。
unsigned char packed[7]; //compression storage
int i, jCount;
int j;
int bufferLength= sizeof(unpacked)/sizeof(char);
//loop through the buffer array
for (i=0; i< bufferLength-1; i++){
j= i%7;
jCount++;
//fill up the compressed array
packed[i]= packer(unpacked[i], unpacked[i+1], j);
//compressed array is full, write to file, then clear
if ((j%7==6) && (j > 1)){
int writeLoop;
for (writeLoop=0; writeLoop < 8; writeLoop++){
//printf("%X", packed[writeLoop]); //write to screen
write(openWriteFile, &packed[writeLoop], 1);//this is my trouble, write to file
}
memset(&packed[0], 0, sizeof(packed)); //clear array
}
//more code down here for padding the end of short bytes.
write函数期望将
const void *
作为第二个参数,这就是为什么我要引用该特定数组插槽的值,但没有任何内容写入文件的原因。当我删除&时,我得到一个编译警告。
任何使我走上正确道路的建议都值得赞赏。
最佳答案
我认为应该是packed[j] = ...
,而不是packed[i]
。就像chrisaycock指出的那样,您可以编写整个打包数组,而无需循环:write(openWriteFile, packed, sizeof packed);
并且应避免使用所有这些文字...您有3个实例7,一个实例8,一个实例6,当您应该有一个定义的常数并适当使用+或-1时。而且jCount尚未初始化。
编辑:
这是一些没有这些问题的代码:
#define PACKEDSIZE 7 // Why 7?
unsigned char packed[PACKEDSIZE]; //compression storage
int i, jCount = 0;
int j = 0;
int bufferLength = sizeof(unpacked)/* /sizeof(char) ... not needed because sizeof(char) is 1 in all conforming implementations */;
//loop through the buffer array
for( i = 0; i < bufferLength-1; i++ ){
jCount++;
//fill up the compressed array
packed[j]= packer(unpacked[i], unpacked[i+1], j);
if( ++j == sizeof packed ){
if( write(openWriteFile, packed, sizeof packed) != sizeof packed )
reportWriteError(); // stub -- do real error handling here
//memset(packed 0, sizeof packed); // this isn't necessary
j = 0;
}
}