下面的列表显示了字码组合包括文本的和二进制文件的。通常你可以选择从文本文件中读取或写入文件,但是不要两者同时使用。
就二进制文件而言,你可以选择对相同文件进行读取和写入的操作。列表告诉了我们可以用字码进行哪些操作。
Mode Type of file Read Write Create Truncate
r text Read
rb+ binary Read
r+ text Read Write
r+b binary Read Write
rb+ binary Read Write
w text Write Create Truncate
wb binary Write Create Truncate
w+ text Read Write Create Truncate
w+b binary Read Write Create Truncate
wb+ binary Read Write Create Truncate
a text Write Create
ab binary Write Create
a+ text Read Write Create
a+b binary Write Create
ab+ binary Write Create
就笔者的经验来看,除非你刚刚创建完文件或读取完文件,否则你通过使用“w+b”只能侥幸成功。
还有一些情况允许其他字母存在。例如微软运行“t”代表文本模式,“c”用于认可,“n”用于非认可,“S”为顺序存取优化缓冲,“R”代表随机存取,“T”代表临时性而“D”用于 删除/临时性保存。
使用二进制文件的主要原因是可以获得灵活性;你可以读取或写入文件的任意部分。文本文件只能让你按照顺序读取或写入。现在随着SQLite或MySQL数据库的普及,在二进制文件中使用随机存取的需要减少了。从某种意义上说,随机存取文件记录有点老土了,但是仍然还是有用的。
笔者在数据库普及之前就使用过基于随机存取文件的多种数据处理方案。例如,在小文件中,笔者使用的是 索引/数据 文件模式。该模式包括两个文件。一个是数据文件,它保存了一些长短不一的记录。另一种文件是索引文件,这样的文件拥有同样的记录作为数据文件。但是在索引文件中每个记录的长度相同而且都由两个适合结构的部分组成。
struct {??fpos_t pos;??int size; } indexrec;
类型fpos_t是由fsetpos()和fgetpos()定义和使用的执行。这些是fseek和ftell更新的版本且更有助于创建书签。如果你正在计算文件闻之且需要设定文件那么你应该使用fseek(),另外ftell()也可以给你int的当前位置。
在实际操作中,fpos_t可能只是一个int但是你应该使用fpos_t类型。它保存了当前文件指示器的副本。这是随机存取文件的属性,它表明了下一次读取或写入的位置。它的粒度为一,因此你可以将其放在文件的任意位置。