弄清楚在Unix中写

时间:2011-03-02 05:13:51

标签: c unix

我们已经为系统编程分配了一个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 *作为第二个参数,这就是为什么我引用该特定数组槽的值,但没有任何内容写入该文件。

当我删除&amp;时,我收到编译警告。

任何让我走上正确道路的建议都值得赞赏。

2 个答案:

答案 0 :(得分:1)

你正在阅读数组的末尾。您声明packed[7]然后在写循环中访问元素0到7(8个元素)。

通常,您可以使用write来编写一系列字节,而不仅仅是一个字节。在您的情况下,这意味着替换

    int writeLoop;
    for (writeLoop=0; writeLoop < 8; writeLoop++){
        write(openWriteFile, &packed[writeLoop], 1);
    }

    write(openWriteFile, packed, 8);

并将您的声明更改为

unsigned char packed[8]; //compression storage

或者它应该是7字节写?在这种情况下,用7s替换8s。

答案 1 :(得分:0)

我认为应该是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;
        }
    }