Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Unix中解决写问题_C_Unix - Fatal编程技术网

C 在Unix中解决写问题

C 在Unix中解决写问题,c,unix,C,Unix,我们被分配了一个系统编程的ASCII压缩项目,我的代码中有一行代码,这让我很为难 我问了一个关于压缩的问题,在纸上处理了一个示例文件的前十几个字母后,我将数组代码改编成我的程序。在ddd中,packed[]数组的值是我在纸上计算出来的,但是这些值没有写入文件 unsigned char packed[7]; //compression storage int i, jCount; int j; int bufferLength= sizeof(unpacked)

我们被分配了一个系统编程的ASCII压缩项目,我的代码中有一行代码,这让我很为难

我问了一个关于压缩的问题,在纸上处理了一个示例文件的前十几个字母后,我将数组代码改编成我的程序。在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.
无符号字符压缩[7]//压缩存储
int i,jCount;
int j;
int bufferLength=sizeof(未打包)/sizeof(字符);
//循环通过缓冲区数组
对于(i=0;i1)){
int writeLoop;
对于(writeLoop=0;writeLoop<8;writeLoop++){
//printf(“%X”,打包[WriteLop]);//写入屏幕
write(openWriteFile,&packed[writeLoop],1);//这是我的问题,写入文件
}
memset(&packed[0],0,sizeof(packed));//清除数组
}
//下面有更多填充短字节结尾的代码。
write函数需要一个
const void*
作为第二个参数,这就是为什么我引用了特定数组槽的值,但没有向文件写入任何内容

    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.
当我删除&时,我得到一个编译警告


任何能让我走上正确道路的建议都将不胜感激。

我认为应该是
压缩的[j]=…
,而不是
压缩的[I]
。正如chrisaycock所指出的,您只需编写整个压缩数组,不需要循环:
编写(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;
        }
    }
#定义PACKEDSIZE 7//为什么是7?
无符号字符压缩[PACKEDSIZE];//压缩存储
int i,jCount=0;
int j=0;
int bufferLength=sizeof(unpacketed)/*/sizeof(char)…不需要,因为在所有一致性实现中,sizeof(char)为1*/;
//循环通过缓冲区数组
对于(i=0;i
您读取的数据超过了数组的末尾。您可以声明
压缩[7]
然后访问写入循环中的元素0到7(8个元素)

通常,您会使用
write
来写入一系列字节,而不仅仅是一个字节

    int writeLoop;
    for (writeLoop=0; writeLoop < 8; writeLoop++){
        write(openWriteFile, &packed[writeLoop], 1);
    }
并将您的声明更改为

unsigned char packed[8]; //compression storage

或者它应该是一个7字节的写操作?在这种情况下,将8s替换为7s。

对于初学者来说,
packed
只有7个字节,但输出循环会重复8次。此外,无论如何,您不应该需要循环;
write(openWriteFile,packed,8)
应该可以工作。如果系统调用失败,通常最好检查返回值,然后检查可能的错误。对于系统编程作业,这样做并持续报告可能会为您赢得额外分数。@chrisayock,根本没有任何更改。我有一个
写入(openWriteFile,&fileSize,4)
声明将原始文件大小写入压缩文件,并将
int fileSize
完美写入文件。@Keith,当我打开写入文件时,它是使用正确的权限创建的ssions,因为rw出现在
ls-l
输出中。我有内置的错误处理功能,但错误只显示为负数,
writepenfile
是一个正数。@Jason您的评论让人困惑/困惑。我认为您不理解chrisaycock或Keith写的内容。特别是,写操作可能会失败,例如,您可能会n输出设备上的空间不足,但您没有检查失败。@jason。您使用
int
进行的测试很好。我不确定是否遵循了您的注释。正、负和
writepenfile
。调用
::write
应该返回
1
。是吗?啊,捕捉得好!OP在编写缓冲区而不是依赖mod操作。我尝试了您的建议,但结果没有改变,因为在写入文件头后,文件大小显示为4字节。至于为什么7是打包的,当使用8字节输入数组到7字节输出时,我更容易理解位移。@Jason,那么您又做错了什么。。.这段代码执行了吗?解包是如何定义的?顺便说一句,sizeof(char)总是1,所以你不需要这个除法。你是对的,这是另外一回事。我让我的数组结束逻辑跟随这一节,在第一次传递时它触发true。unpacket被定义为主函数上方的全局变量。谢谢你的帮助!
sizeof(char)
始终为1…即使
char
为16位。^-我工作时的印象是,要写入数组的内容,每个元素都需要一个循环。你是说这不是真的吗?另外,这是一个7字节的写入,而不是8字节,因为我正在将8字节缩减为7。@Jason不,这不是真的——write有一个参数说明有多少字节写。你的writeLoop=0;writeLoop<8迭代8次,而不是7次。@Jason