C 理解Unix中的“读、写”系统调用
我的系统编程项目让我们实现一个压缩/解压程序,通过删除零位并将输出写入一个单独的文件来压缩ASCII文本文件,具体取决于压缩或解压例程是否正常工作。为此,教授要求我们使用二进制文件和Unix系统调用,包括打开、关闭、读取、写入等 根据我对读写的理解,它通过定义的字节块读取二进制数据。然而,由于这个数据是二进制的,我不知道如何解析它 这是我的代码的精简版本,不包括错误检查:C 理解Unix中的“读、写”系统调用,c,unix,system-calls,C,Unix,System Calls,我的系统编程项目让我们实现一个压缩/解压程序,通过删除零位并将输出写入一个单独的文件来压缩ASCII文本文件,具体取决于压缩或解压例程是否正常工作。为此,教授要求我们使用二进制文件和Unix系统调用,包括打开、关闭、读取、写入等 根据我对读写的理解,它通过定义的字节块读取二进制数据。然而,由于这个数据是二进制的,我不知道如何解析它 这是我的代码的精简版本,不包括错误检查: void compress(char readFile[]){ char buffer[BUFFER] //buffe
void compress(char readFile[]){
char buffer[BUFFER] //buffer size set to 4096, but tunable to system preference
int openReadFile;
openReadFile= open(readFile, O_RDONLY);
}
如果我使用
read
将数据读入缓冲区
,缓冲区中的数据是二进制格式还是字符格式?我所遇到的任何东西都没有提到这个细节,它与我如何解析内容非常相关。我将引用
模式字符串还可以包括
字母“b”作为最后一个字符
或者作为一个角色
两个字符中的任意一个字符
上面描述的字符串。这是
严格要求与C89兼容
没有效果,;忽略“b”
在所有POSIX一致性系统上,
包括Linux
因此,即使是高级函数也会忽略模式:-)它将读取文件的二进制内容并将其加载到内存缓冲点中。当然,一个字节是8位,这就是为什么一个字符是8位,因此,如果文件是一个普通的纯文本文档,那么您将得到一个可打印的字符串(注意它的结尾,read返回字节数(ascii编码的纯文本文件中的字符)read) 编辑:如果您正在读取的文件不是文本文件,并且是二进制表示的集合,则可以将缓冲区的类型设置为文件的类型,即使它是结构。read()将在不进行任何解释的情况下读取字节(因此“二进制”模式) 如果是二进制的,并且希望访问单个字节,则应使用无符号字符缓冲区
无符号字符缓冲区[buffer]
。您可以将字符/无符号字符视为字节,在linux上为8位
现在,由于您要处理的是8位ascii压缩为7位,因此您必须再次将这些7位转换为8位,以便能够理解数据
解释所做的事情-考虑文本<代码>嘿< /代码>。这是3字节。每个字节将有8位,在ascii中,这是位模式:
01001000 011001010111001
现在,从中删除最重要的位,将剩余的位向左移动一位
X101000 X1100101 X1111001
上面,X是要删除的位。删除这些内容,并移动其他内容,最终将使用以下模式生成字节:
10010001 10010111 11001000
最右边的3位正好用0填充。到目前为止,还没有节省空间。还有3个字节。
对于8个字节的字符串,我们保存了1个字节,因为这将压缩到7个字节
现在您必须对读回的字节执行相反的操作A
char
是一个字节。你所说的“二进制或字符格式”是什么意思?他可能是在“混合”fopen的“文本模式”和“二进制模式”open
,作为一个原语,没有“文本模式”(如果我没记错的话),所以它总是处于“二进制模式”@xanatos:…这对我使用的任何*尼克斯都没有任何影响used@matti我在fopen的随机手册上看到:“在许多环境中,如大多数基于UNIX的系统中,将文件作为文本文件或二进制文件打开没有区别;两种方法的处理方式完全相同,但建议使用更好的可移植性。“但是,很多不是全部,而他是一个智能问题(如果这是问题),C中没有一个单独的类型用于<代码>字节<代码>。