在C语言中,文件操作是程序设计中必不可少的一部分。本文主要关注的是文件的随机读写,这是一种非顺序的文件访问方式,允许程序从文件的任意位置读写数据,而不是从头到尾依次进行。这对于处理大型文件或者需要频繁跳转到文件不同位置的场景尤其有用。
实现文件的随机读写,首先需要掌握两个关键的文件定位函数:`rewind()` 和 `fseek()`。`rewind()` 函数将文件位置指针移动到文件的开头,其原型为 `void rewind ( FILE *fp )`,其中 `fp` 是指向文件的指针。而 `fseek()` 函数则允许我们将位置指针移动到文件的任意位置,原型为 `int fseek ( FILE *fp, long offset, int origin )`。参数 `offset` 表示要移动的字节数,`origin` 指定移动的起始位置,可以是 `SEEK_SET`(文件开头),`SEEK_CUR`(当前位置)或 `SEEK_END`(文件末尾)。例如,`fseek(fp, 100, SEEK_SET)` 将位置指针移动到文件开头100个字节处。
进行随机读写时,通常配合使用 `fread()` 和 `fwrite()` 函数。这两个函数用于二进制文件的读写,它们能准确地读取或写入指定大小的数据块。例如,在示例代码中,定义了一个 `struct stu` 结构体来存储学生信息,然后通过 `fwrite()` 将三组学生信息写入文件,接着使用 `fseek()` 移动位置指针并用 `fread()` 读取第二条学生信息。
以下是对示例代码的简要解释:
1. 定义了一个 `struct stu` 结构体,包含姓名、学号、年龄和成绩四个字段。
2. 创建一个 `boys` 数组来存储学生信息,并定义一个指向结构体的指针 `pboys`。
3. 打开文件 "d:\\demo.txt",使用 "wb+" 模式,即写入模式并允许读取。
4. 循环读取用户输入的学生信息,并存储到数组 `boys` 中。
5. 使用 `fwrite()` 将整个 `boys` 数组写入文件。
6. 使用 `fseek()` 将位置指针移动到文件开头后的 `sizeof(struct stu)` 字节处,即第二条学生信息的位置。
7. 使用 `fread()` 读取一条学生信息到 `boy` 结构体中。
8. 输出读取到的学生信息。
9. 关闭文件。
这个示例清晰地展示了如何在C语言中进行文件的随机读写操作,包括文件定位和数据的读写。需要注意的是,`fseek()` 在文本文件中的使用可能会因为文本转换问题导致定位不准确,所以通常推荐在二进制文件中使用随机读写操作。理解并熟练运用这些函数对于进行复杂的文件操作至关重要。