Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_System Calls - Fatal编程技术网

C 理解Unix中的“读、写”系统调用

C 理解Unix中的“读、写”系统调用,c,unix,system-calls,C,Unix,System Calls,我的系统编程项目让我们实现一个压缩/解压程序,通过删除零位并将输出写入一个单独的文件来压缩ASCII文本文件,具体取决于压缩或解压例程是否正常工作。为此,教授要求我们使用二进制文件和Unix系统调用,包括打开、关闭、读取、写入等 根据我对读写的理解,它通过定义的字节块读取二进制数据。然而,由于这个数据是二进制的,我不知道如何解析它 这是我的代码的精简版本,不包括错误检查: void compress(char readFile[]){ char buffer[BUFFER] //buffe

我的系统编程项目让我们实现一个压缩/解压程序,通过删除零位并将输出写入一个单独的文件来压缩ASCII文本文件,具体取决于压缩或解压例程是否正常工作。为此,教授要求我们使用二进制文件和Unix系统调用,包括打开、关闭、读取、写入等

根据我对读写的理解,它通过定义的字节块读取二进制数据。然而,由于这个数据是二进制的,我不知道如何解析它

这是我的代码的精简版本,不包括错误检查:

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中没有一个单独的类型用于<代码>字节<代码>。