关于fprintf与缓冲区的一点发现

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:39   1439   0

先说结论:fprintf函数在默认情况下只有当缓冲区溢出或是程序自然停止时时才会输出数据到文件。

而当程序中止(例ctrl+c)时,若缓冲区未满 缓冲区亦不会向目标输出流


也许上面说的是大多数人都知道的 或是网上早有类似之叙述;但是作为一名c新手 望藉此文章给别的对此类问题不明的新手以参考。若上述结论存在不正或不严谨之处 亦欢迎所见之士予以指正。

问题发现:

在进行一次大量循环的问题分析时,用到如下代码:

#include<stdio.h>
#include<stdlib.h>
int rand1(void);
int main()
{
    FILE *fp;
    fp=fopen("output.csv","w");
    float origin[25]={348,352,347,349,347.5,347,330,329,329,327.5,329,331.5,348.5,347,346.5,348,347.5,348,333,330,332.5,331.5,331.5,332,332};
    float target[25]={0};
    float total[5]={0};
    int times=0;
    int r_times=0;
    int k,m,n,t,max;
    printf("Please enter the max value:");
    scanf("%d",&max);
    getchar();
    while(1)
    {
      for(m=0;m<25;m++)
      {
        k=rand1();
        target[k]=origin[m];
      }
      for(n=0;n<25;n++)
      {
        total[n/5] += target[n];
      }
     if(abs(total[0]-total[1])<max&&abs(total[1]-total[2])<max&&abs(total[2]-total[3])<max&&abs(total[3]-total[4])<max&&abs(total[4]-total[0])<max)
      {
        for(m=0;m<25;m++)
          fprintf(fp,"%.1f,",target[m]);
        for(m=0;m<5;m++)
          fprintf(fp,"%.1f,",total[m]);
        fprintf(fp,"\n");
          times++;   
      }
      for(n=0;n<25;n++)
      {
        target[n]=0;
        total[n/5]=0;
      }
      if(r_times%500000==0)
      {
        printf("Number of possible solution found in %d times run:%d\n",r_times,times);
        printf("counting...(PRESS CTRL+C to stop.)\n");
      }
      r_times++;
      if(r_times==200000000||times==10000)
      {
        printf("enough.");
        break;
      }
      if(r_times==200000000&×==0)
        printf("No solution found.");
    }
}

int rand1(void)
{
  static int arr[25]={-1};
  static int times=0;
  int a;
  int n=(unsigned int)rand()%25;
  while(1)
  {
    for(a=0;a<24;a++)
    {
      if(n!=arr[a]&×!=0)
        continue;
      break;
    }
    if(a==24||times==0)
    {
      arr[times]=n;
      times++;
      break;
    }
    else
      n=rand()%25;
  }
  if(times==25)
  {
    times=0;
    for(a=0;a<25;a++)
      arr[a]=-1;
  }

  return n;
}
当输入为7时 一段时间内得出的结果很少 中止程序后检视输出文件output.csv,却没有输出任何数据。

而当输入为8时 相对答案较多 一段时间后中止程序 可见结果正确输出到output.csv

思考后考虑到是数据存留在缓冲区的问题 于是试用了fflush函数将缓冲区实时输出 。即在原代码第35行加入:

fflush(fp);
之后再次输入7 运行后正常输出。
然而 为什么在以前的简单fprintf函数相关习题中 少量数据也能够正常输出呢?
因此猜测: 在函数自然中止时 留在缓冲区的数据流会自动流入文件。
修改原代码,在第38行加上:
if(times==5)
    break;
进行测试 再次编译 等待程序自然终止
检视output.csv 正常输出。
由此得到文初所叙之结论。

本人系大一非计科新生 学艺不精 仅以此文记录自己的一点发现 若真有缘被别人看到 希望能有所参考;也欢迎各位指正。

欢迎大家访问我的github: Github/JacksonSui
2016.11.20


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP