公 告

欢迎各位网友添加友情链接,在您添加本博客:http://linux0818.blogspot.com/ 做为链接后, E-mail:linux0818@gmail.com给我,我将将您的网址添加到本博客。

2008年12月16日星期二

C语言中fflush等函数的使用

在有些时候,你会发现你的输出并没有按照你代码的流程输出, 比如说当你用C语言写了做了一个写文件的函数并印出一些信息,供perl或php等调用.而这时你会发现, perl或php并没有获取到你C语言中的打印信息.而代码什么都没有错误,在linux终端也可以正确打印出来. 这时可真是郁闷吧. 那么, 记住了, 这很大可能是没有更新你的缓冲区了. 这时int  fflush(FILE *stream)这个函数就有用了. 下面看看这个函数的信息:
fflush
【功能】清空某个流。
【原型】int fflush(FILE *fp)
【位置】stdio.h
【说明】如果出现任何错误则返回 EOF。
【参见】flushall,fclose
 
下面还是用例子来说明吧:
文件名: fflush.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int writefile(char *filename, char *buf, int length)
{
   FILE *fp;
   int j = 0;
   size_t i = 0;
   fp = fopen(filename, "w");
   if (fp == NULL) {
       printf("\topen file error!\n");
       return -1;
   } else {
       while (length != 0) {
           i = fwrite(&buf[j], 1, 1, fp);
           length--;
           j ;
       }
   }
   fflush(fp);
   fclose(fp);
   return 0;
}
int readfile(char *filename, char *buf)
{
   FILE *fp;
   int j = 0;
   size_t i;
   fp = fopen(filename, "rb");
   if (fp == NULL) {
       printf("error\n");
       return -1;
   } else {
       while (1) {
           i = fread(&buf[j], 1, 1, fp);
           if (i == 0)
               break;
           j ;
       }
   }
   fflush(fp);
   fclose(fp);
   return 111;
}
int main(int argc, char **argv)
{
   char msg[128] = "hello,xiong feng!";
   char fbuf[1024] = "";
   char *filename = "/xiongfeng";
   int w_ret = 0;
   int r_ret = 0;
   w_ret = writefile(filename, msg, strlen(msg));
   if (w_ret < 0) {
       printf("Write file %s fail!\n", filename);
   }
   printf("msg:%s\n", msg);    // 如果在未加入fflush(fp), 该输出有可能不能正常输出,特别是在perl调用该程序时, perl不能获取该程序中的输出
   r_ret = readfile(filename, fbuf);
   if (r_ret < 0) {
       printf("Read file %s fail!\n", filename);
   }
   printf("fbuf:%s\n", fbuf);   // 这行同上面的: printf("msg:%s\n", msg);    
   return 0;
}
--------------------------------end-----------------------------------
我在网上还找了一些个封装了一次fflush的函数, 如下:
void flush(FILE *stream)
{
    int duphandle;
    /* flush the stream's internal buffer */
    fflush(stream);
    /* make a duplicate file handle */
    duphandle = dup(fileno(stream));
    /* close the duplicate handle to flush/
       the DOS buffer */
    close(duphandle);
}
用此函数来替代fflush也行,但我感觉在这时, 调用dup(), fileno()等函数没什么用.
下面是这两个函数的分析:
dup():
int   dup(int   handle);  
作用:复制一个文件句柄
--------------------------------end-----------------------------------
fileno():
范例:
fileno.c:
#include <stdio.h>
int main(int argc, char **argv)
{
   FILE *fp;
   int fd;
   fp = fopen("/xiongfeng", "r");
   fd = fileno(fp);
   printf("fd = %d\n", fd);
   fclose(fp);
   return 0;
}
运行结果: fd = 3
--------------------------------end-----------------------------------
--
/**************************************/
Name: Xiong Feng
QQ:23562033
Address: GuangZhou.China
/**************************************/

没有评论:

发表评论