在Unix中理解`read,write`系统调用

时间:2011-02-21 20:19:32

标签: c unix system-calls

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

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

这是我的代码的精简版本,减去错误检查:

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将数据读入buffer,缓冲区中的数据是二进制还是字符格式?我没有遇到任何细节的地址,它与我解析内容的方式非常相关。

3 个答案:

答案 0 :(得分:2)

read()将在没有任何解释的情况下读取字节(所以“二进制”模式)。

作为二进制文件,并且您想要访问各个字节,您应该使用unsigned char的缓冲区 unsigned char buffer[BUFFER]。你可以将char / unsigned char视为字节,它们在linux上是8位。

现在,由于你所处理的是8位ascii压缩到7位,你必须再将这7位转换成8位,这样你才能理解数据。

要解释已完成的工作 - 请考虑文本Hey。这是3个字节。这些字节每个都有8位,而在ascii中则是位模式:

01001000 01100101 01111001

现在,从中删除最重要的位,将剩余的位向左移一位。

X1001000 X1100101 X1111001

上面,X是要删除的位。删除这些,并移动其他人,你最终得到这种模式的字节:

10010001 10010111 11001000

最右边的3位只用0填充。到目前为止,没有节省空间。还有3个字节。 使用8字节的字符串,我们保存了1个字节,因为它将压缩到7个字节。

现在你必须对你在 中读回的字节做相反的反应

答案 1 :(得分:0)

我将从http://www.kernel.org/doc/man-pages/online/pages/man3/fopen.3.html

引用fopen函数的手册(基于open函数/原语)
  

模式字符串还可以包含   字母'b'或者作为最后一个字符   或者作为一个角色   任意两个字符中的字符   上面描述的字符串这是   严格要求与C89兼容   并没有效果; 'b'被忽略了   在所有符合POSIX标准的系统上,   包括Linux

所以即使是高级函数也会忽略模式: - )

答案 2 :(得分:0)

它将读取文件的二进制内容并将其加载到内存缓冲区中。当然,一个字节是8位,这就是char为8位的原因,所以,如果文件是普通的纯文本文档,你最终会得到一个可打印的字符串(小心它的结束方式,read返回数字)字节数(ascii编码的纯文本文件中的字符)读取)。

编辑:如果您正在阅读的文件不是文本文件,并且是二进制表示的集合,您可以将缓冲区的类型设置为文件之一,即使它是结构。