用setvbuf设置缓冲区的问题,好难理解啊!!!!!
我首先建立了一个文件,26字母写了5行,关闭重新打开,设置缓冲区为行缓冲。读取数据时,我并没有发现它变现出行缓冲的特性啊,话说行缓冲到底是什么意思啊?
而且缓冲区的数据也不对啊,读完第一遍A-Z后,又读出ABB才结束,谁能告诉我这些都是怎么回事啊,我自学的,好多不懂,谢谢了。
程序代码:
#include <stdio.h> int main(void) { FILE * F1,* F2; char buff[31] = { 0 }; //定义缓存数组,初始化为0,定义31个,后面会写入30个,保留最后一位空字符 char ar[30] = "ABC.txt"; //文件1 char br[30] = "def.txt"; //文件2 char temp[30] = { 0 }; //字符数组,初始化为0 if ((F1 = fopen(ar, "w")) == NULL) //第一次打开文件1,“w“ ,用标准缓存 { fputs("Can't open file 1 for \"w\".", stderr); exit(1); } for (int j = 0; j < 5; j++) //写文件:26个字母写5行 { for (int i = 0; i < 26; i++) putc('A' + i, F1); putc('\n', F1); } fclose(F1); //关闭文件 if ((F1 = fopen(ar, "r")) == NULL) //第二次打开文件1,“r” { fputs("Can't open file 1 for \"r\".", stderr); exit(2); } setvbuf(F1, buff, _IOLBF, 30); //设置缓存,大小30 fgets(temp, 11, F1); //从文件1读取10个字符到temp puts("temp 1:"); for (int i = 0; i < 30; i++) //打印temp中30个字符 printf("%c", temp[i]); printf("0"); //用0标记打印结束的位置 printf("\n"); puts("buff 1:"); for (int i = 0; i < 30; i++) //打印buff中的30个字符 printf("%c", buff[i]); printf("0"); //因为会有回车符,用0标记打印结束的位置 printf("\n"); fgets(temp, 18, F1); //再次从文件1读取,这次读取17个字符到temp, //也就是读到第一个换行符,希望会刷新缓存 puts("\ntemp 2:"); for (int i = 0; i < 30; i++) //打印temp中30个字符 printf("%c", temp[i]); printf("0"); printf("\n"); puts("buff 2:"); for (int i = 0; i < 30; i++) //打印buff中的30个字符 printf("%c", buff[i]); printf("0"); printf("\n"); if ((F2 = fopen(br, "w")) == NULL) //打开文件2,“w” { puts("Can't open file 2 for \"w\"."); exit(3); } fputs(buff,F2); //将buff中的字符串输入F2 fclose(F2); //关闭F2,刷新缓存 while (1); return 0; }