面试题答案
一键面试-
行缓冲实现:
- 对于标准输出等流,可以通过调用
setvbuf
函数来设置为行缓冲。当写入的数据遇到换行符\n
时,缓冲区的数据会被刷新到目标设备。
#include <stdio.h> int main() { // 设置标准输出为行缓冲 setvbuf(stdout, NULL, _IOLBF, 0); printf("This is a line buffered output.\n"); return 0; }
- 这里
setvbuf
函数的第一个参数stdout
是要设置缓冲模式的流,第二个参数NULL
表示让系统自动分配缓冲区,_IOLBF
表示行缓冲模式,最后一个参数0
表示缓冲区大小采用默认值。
- 对于标准输出等流,可以通过调用
-
全缓冲实现:
- 同样使用
setvbuf
函数来设置为全缓冲。全缓冲意味着只有当缓冲区填满或者明确调用fflush
函数时,数据才会被刷新到目标设备。
#include <stdio.h> int main() { char buffer[1024]; // 设置标准输出为全缓冲,使用自定义的缓冲区 setvbuf(stdout, buffer, _IOFBF, sizeof(buffer)); for (int i = 0; i < 1000; i++) { printf("This is part of full - buffered output."); } // 手动刷新缓冲区 fflush(stdout); return 0; }
- 在这段代码中,
setvbuf
函数的第一个参数stdout
是目标流,第二个参数buffer
是自定义的缓冲区,_IOFBF
表示全缓冲模式,sizeof(buffer)
指定了缓冲区的大小。之后通过循环写入数据,在没有填满缓冲区前数据不会自动输出,直到调用fflush(stdout)
手动刷新缓冲区。
- 同样使用
-
混合缓冲策略实现:
- 假设我们有两个文件流,一个设置为行缓冲,另一个设置为全缓冲。
#include <stdio.h> int main() { FILE *lineBufferedFile = fopen("line_buffered.txt", "w"); FILE *fullyBufferedFile = fopen("fully_buffered.txt", "w"); // 设置行缓冲文件流 setvbuf(lineBufferedFile, NULL, _IOLBF, 0); // 设置全缓冲文件流 char buffer[1024]; setvbuf(fullyBufferedFile, buffer, _IOFBF, sizeof(buffer)); // 向行缓冲文件写入数据 fprintf(lineBufferedFile, "This is line - buffered data.\n"); // 向全缓冲文件写入数据 for (int i = 0; i < 1000; i++) { fprintf(fullyBufferedFile, "This is full - buffered data."); } // 手动刷新全缓冲文件的缓冲区 fflush(fullyBufferedFile); fclose(lineBufferedFile); fclose(fullyBufferedFile); return 0; }
- 这里分别打开两个文件,对
lineBufferedFile
设置为行缓冲,对fullyBufferedFile
设置为全缓冲,并分别进行数据写入操作。对于全缓冲的文件流,在写入一定量数据后需要手动调用fflush
刷新缓冲区,而对于行缓冲的文件流,遇到换行符会自动刷新。