用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;
}

