MST

星途 面试题库

面试题:C语言IO流缓冲区与文件指针移动

在C语言文件操作中,结合IO流缓冲区机制,说明当使用 `fseek` 函数移动文件指针后,缓冲区的状态会发生什么变化?假设有一个文本文件 `text.txt`,内容为 `abcdefg`,代码如下: ```c #include <stdio.h> int main() { FILE *file = fopen("text.txt", "r+"); char buffer[10]; fread(buffer, 1, 3, file); fseek(file, 2, SEEK_CUR); fwrite("xyz", 1, 3, file); fclose(file); return 0; } ``` 分析这个过程中缓冲区的读、写操作以及文件内容最终的变化情况。
11.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. IO流缓冲区机制
    • 在C语言的文件操作中,IO流缓冲区用于暂存数据,减少对物理文件的直接读写次数,提高效率。当进行读操作时,数据会从文件读取到缓冲区,再从缓冲区读取到程序变量中;写操作则相反,数据先写入缓冲区,当缓冲区满、调用 fflush 函数或关闭文件时,缓冲区的数据才会写入物理文件。
  2. fseek函数对缓冲区的影响
    • 当调用 fseek 函数移动文件指针时,如果缓冲区中有未处理的数据(对于读操作,缓冲区可能有未读完的数据;对于写操作,缓冲区可能有未写入文件的数据),情况如下:
      • 对于读操作缓冲区:fseek 函数会清空读操作缓冲区。因为文件指针移动后,原缓冲区中的数据可能与新位置的数据不相关了,需要重新从文件读取数据到缓冲区。
      • 对于写操作缓冲区:如果缓冲区中有数据,fseek 函数会先将写操作缓冲区中的数据写入文件,然后清空写操作缓冲区。这是为了确保文件指针移动后,新位置的数据操作是基于文件中已有的正确内容,而不是受之前未写入文件的缓冲区数据影响。
  3. 代码分析
    • 初始状态:打开文件 text.txt,内容为 abcdefg,以 r+ 模式打开,即可读可写。
    • 读操作
      • fread(buffer, 1, 3, file); 从文件读取3个字符 abcbuffer 数组中。此时,读操作缓冲区中存放了这3个字符(假设缓冲区已经从文件读取了数据)。
    • 文件指针移动
      • fseek(file, 2, SEEK_CUR); 从当前位置(读完 abc 后,文件指针指向 d)向后移动2个字节,此时文件指针指向 f。由于是读操作后移动文件指针,读操作缓冲区被清空。
    • 写操作
      • fwrite("xyz", 1, 3, file); 将字符串 xyz 写入文件。此时,数据先写入写操作缓冲区。由于写操作缓冲区未满,数据不会立即写入物理文件。
    • 关闭文件
      • fclose(file); 关闭文件时,会将写操作缓冲区中的数据 xyz 写入物理文件。
  4. 文件内容最终变化情况
    • 文件原内容 abcdefg,经过上述操作后,最终内容变为 abcxzyg。原因是读了 abc 后,文件指针移动到 f 位置,写入 xyzxyz 覆盖了 def 的前3个字符,即 def 变为 xzy,后面的 g 保持不变。

综上所述,在这个过程中,读操作先填充读缓冲区,fseek 清空读缓冲区,写操作填充写缓冲区,关闭文件时写缓冲区数据写入文件,最终文件内容变为 abcxzyg