setbuf和freopen

看memcached代码的时候学习了一个api,setbuf,可以设置文件流的缓冲区。

#include <stdio.h>

void setbuf(FILE *stream, char *buf);
       void setbuffer(FILE *stream, char *buf, size_t size);
       void setlinebuf(FILE *stream);
       int setvbuf(FILE *stream, char *buf, int mode , size_t size);

使用技巧:

setbuf(stdout, NULL);

指定buf参数为NULL可以将文件指针设置为无缓冲的文件指针,和linux的open打开的文件描述符一样,写入data会立即刷新到文件。ps:linux下的stdout和stderr默认是没有缓冲区的,fprintf会直接输出到屏幕,这里的stdout泛指文件指针。

char buff[2048] = {0};

setbuffer(stdout, buff, sizeof(buff));

可以给指定的文件指针设置指定大小的缓冲区,以后向该文件写入的data会先缓存起来,缓冲区溢出才会写入文件,这里的例子就给stdout设置了2048的缓冲区。

freopen用来重定向文件流,经常重定向stdin、stdout、stderr。

FILE *freopen(const char *path, const char *mode, FILE *stream);

freopen("./0707.txt", "w", stdout);

linux下的freopen和fopen一样,打开的文件默认有4096的缓冲区,写入data不会立即刷新到文件,不方便作为调试信息,可以在freopen后设置文件缓冲区为NULL。

setbuff(stdout, NULL);

经常用freopen+setbuf将程序运行结果输出到文件来调试。

setbuffer是setbuff一族的另外一个重要api,频繁磁盘io是非常耗性能的,而setbuffer可以将频繁的小data io缓冲起来,减少访问磁盘的次数。可以极大的提升阻塞io的效率。

时间: 2024-08-02 01:40:48

setbuf和freopen的相关文章

文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets

clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * stream); 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标. 返回值 fclose(关闭文件) 相关函数 close,fflush,fopen,setbuf 表头文件 #include<stdio.h> 定义函数 int fclose(FILE * stream); 函数说明 fclos

【技巧】freopen()函数在ACM中的应用

在做题目的过程当中,我们需要在本机上调试,当然我们可以把测试用例一遍一遍粘贴复制,也经常会遇到测试用例很多的时候,输入和输出混了,还要去找输出和题目当中的对照.另外,有的时候题目给的测试用例太少,需要自己或者队友给想几个临界条件,自己动手多添加几个测试用例,每测一遍都要动手输入的话麻烦又浪费时间.这时候freopen()上场了. 函数名:    freopen() 函数声明:  FILE  *freopen(const char *path,const char *mode,FILE *stre

freopen()函数

freopen函数通过实现标准I/O重定向功能来访问文件,而fopen函数则通过文件I/O来访问文件. freopen函数在算法竞赛中常被使用.在算法竞赛中,参赛者的数据一般需要多次输入,而为避免重复输入,使用重定向. 1 freopen 函数说明 2 3 函数名: freopen 4 功 能: 实现数据重定向到文件中 5 用 法: FILE *freopen(const char *filename, const char *mode, FILE *stream); 6 返回值: 成功,则返回

C library function - freopen()

Description The C library function FILE *freopen(const char *filename, const char *mode, FILE *stream) associates a new filename with the given open stream and at the same time closes the old file in the stream. Declaration Following is the declarati

文件重定向函数freopen

头文件:stdio.h FILE *freopen( const char *filename, const char *mode, FILE *stream ); 参数说明: filename:需要重定向到的文件名或文件路径. mode:代表文件访问权限的字符串.例如,"r"表示“只读访问”."w"表示“只写访问”."a"表示“追加写入”. stream:需要被重定向的文件流. 返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NUL

freopen内部实现

1 #include <unistd.h> 2 #include <stdio.h> 3 4 FILE* Freopen(const char *fileName, const char *type, FILE *stream){ 5 FILE *fileFp = fopen(fileName, type); 6 int fd1 = fileno(fileFp); 7 int fd2 = fileno(stream); 8 if(dup2(fd1, fd2) < 0) ret

c++ 用freopen简单的重定向,再也不怕debug了~

#define debug //去掉此句话,重定向部分失效 #include<iostream> #include<cstdio> using namespace std; int main() { #ifdef debug freopen("D:\\in.txt","r",stdin); //从in.txt文件输入 freopen("CON","r",stdin); //从控制台读入 freopen(

freopen()函数测试数据

当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中.但由于调试往往不能一次成功,每次运行时,都要重新输入一遍测试数据,对于有大量输入数据的题目,输入数据需要花费大量时间. 使用freopen函数可以解决测试数据输入问题,避免重复输入,不失为一种简单而有效的解决方法. 函数名:freopen 声明:FILE *freopen( const char *path, const char *mode, FI

Linux下C/C++的文件操作open、fopen与freopen

open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲.linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系统调用open.所以在linux下如果需要对设备进行明确的控制,那最好使用底层系统调用(open), open对应的文件操作有:close, read, write,ioctl 等.fopen 对应的文件操作有:fclose, fread, fwrite, freopen, fseek, ftell,