文件流缓冲区

extern void setbuf(FILE *__restrict __stream, char *__restrict __buf, int __ modes, size_t __n)

此函数第一个参数为要操作的流对象,第2个参数buf必须指向一个长度为BUFSIZE的缓冲区,如果将buf设置为NULL,则关闭缓冲区。

如果执行成功,将返回0, 否则返回非0值。

setvbuf函数声明如下:

extern int setvbuf(FILE * __restrict __stream, char *__restrict __buf, int __modes, size_t __n)

此函数第1个参数为要操作的流对象;第2个参数buf指向一个长度为第4个参数指示大小的缓冲区,第3个参数为缓冲区类型

分别定义如下:

#define _IOFBF 0  //全缓冲
#define _IOLBF 1 //行缓冲
#define _IONBF 2 //无缓冲

#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <string.h>
int main(void)
{
    FILE *fp;
    char msg1[] = "hello,world";
    char msg2[] = "hello\nworld";
    char buf[128];
    if((fp=fopen("no_buf1.txt", "w")) == NULL)
    {
        perror("file open failure!");
        return(-1);
    }
    setbuf(fp, NULL); //关闭缓冲区
    memset(buf, ‘\0‘, 128); //字符串buf初始化‘\0‘
    fwrite(msg1, 7, 1, fp); //向fp所指向的文件流中写7个字符
    printf("test setbuf(no buf)!check no_buf1.txt\n");
    printf("now buf data is: buf=%s\n", buf); //因为关闭了缓冲区,所以buf中无数据
    printf("press enter to continue!\n");
    getchar();
    fclose(fp);
    if((fp =fopen("no_buf2.txt", "w")) == NULL)
    {
        perror("file open failure!");
        return(-1);
    }
    setvbuf(fp, NULL, _IONBF, 0); //设置为无缓冲模式
    memset(buf, ‘\0‘, 128);
    fwrite(msg1, 7, 1, fp);
    printf("test setvbuf(no buf)!check no_buf2.txt\n");
    printf("now buf data is :buf=%s\n", buf);
    printf("press enter to continue!\n");
    getchar();
    fclose(fp);
    if((fp=fopen("l_buf.txt", "w")) == NULL)
    {
        perror("file open failure!");
        return(-1);
    }
    /*
     * 设置为行缓冲
     * 遇到‘\n‘就会刷新缓冲区
     * 所以后面buf中只显示world字符,
     * 在调用fclose()之前,
     * 文件中写入的内容为"\n"之前的内容
     */
    setvbuf(fp, buf, _IOLBF, sizeof(buf));
    memset(buf, ‘\0‘, 128);
    fwrite(msg2, sizeof(msg2), 1, fp);
    printf("test setvbuf(line buf)!check 1_buf.txt, because line buf, only data before enter send to file\n");
    printf("now buf data is :buf=%s\n", buf);
    printf("press enter to continue!\n");
    getchar();
    fclose(fp);
    if((fp=fopen("f_buf.txt", "w")) == NULL)
    {
        perror("file open failure!");
        return(-1);
    }
    /*
     * 设置为全缓冲模式
     * 会将msg2 <=128 字符的数据全部写入缓冲区buf
     * 这时查看buf,里面的内容是所有msg2的字符串的内容
     * 在调用fclose()之前,缓冲区的内容是不会刷新到文件中去的
     * 所以文件中的内容会为空
     * 直到调用fclose()才会把内容写到文件中去
     */
    setvbuf(fp, buf, _IOFBF, sizeof(buf));
    memset(buf, ‘\0‘, 128);
    fwrite(msg2, sizeof(msg2), 1, fp);
    printf("test setbuf(full buf)!check f_buf.txt\n");
    printf("now buf data is: buf=%s\n", buf);
    printf("press enter to continue!\n");
    getchar();
    fclose(fp);
    return 0;
}
时间: 2024-12-28 22:02:35

文件流缓冲区的相关文章

文件流:&quot;fopen&quot;,&quot;fclose&quot;,“ftell”&quot;fseek&quot;,&quot;fgets&quot;,&quot;fprintf&quot; ,“feof”,&quot;fwrite&quot;,&quot;fread&quot;

char const* filename="D:/hello.txt"; "fopen", FILE *fp=fopen(char const *name,char const mode); e.g:FILE *fp = fopen(filename,"wb"); 打开文件流,name为要打开文件的路径,如这里的filename:mode 为对文件的操作模式,通常使用:"wb"(写操作),"rb"(读操作)

C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器,它能够长期保留信息,能读能写,可以刷新重写,方便携带,因而得到广泛使用. 文件(file)是程序设计中一个重要的概念.所谓“文件”,一般指存储在外部介质上数据的集合.一批数据是以文件的形式存放在外部介质(如磁盘.光盘和U盘)上的.操 作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部

重要的几种流:文件流、缓冲流、转换流!

一.文件流(字节流,字符流) 1.字节流 package com.zijie; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class TestFileInputStream { public static void main(String[] args) { int b = 0; FileInputStream in = null

文件流读写、大文件移动 FileStream StreamWriter

文件流读写 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace _09文件流 { class Program { static void Main(string[] args) { //string msg = "飞流直下三千尺"; ////字符串转字节数组 //byte[] buffer = System.Tex

文件流重新整理-20151113

问题1 File和FileInfo的关系 System.IO包含另一个类File,它的功能与FileInfo一样,不过不同的是,File类成员为静态.所以,使用File代替FileInfo就不必实例化一个新FileInfo对象.那么为什么有时还使用FileInfo呢?因为每次通过File类调用某个方法时,都要占用一定的cpu处理时间来进行安全检查,即使使用不同的File类的方法重复访问同一个文件时也是如此.而,FileInfo类只在创建FileInfo对象时执行一次安全检查. //两行代码意义是

C# IO操作(四)大文件拷贝(文件流的使用)、文件编码

     大文件拷贝(文件流的使用).文件编码 首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一次性加载到内存中:事实上,内存也不允许这么干),所以在C#中出现了内存流这个东西.先看下面的内容,File类中的常用读取文件方法会将文件内容一次性全部加载到内存中: 1 string sPath = @"C:\Users\Chens-PC\Desktop\Nginx.txt"; 2 //F

Java IO文件流

package com.zb.io.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.F

C++文件流类与文件流对象具体介绍

文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件流是由若干个文件组成的流.文件流本身不是文件,而只是以文件为输入输出对象的流.若要对磁盘文件输入输出,就必须通过文件流来实现. 在C++的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作.在 图13.2(详情请查看:与C++输入输出有关的类和对象)中可以看到除了标准输入输出流类istr

文件操作函数及文件流详解

这几天着重研究了一下文件操作函数的原理及实现,在这里与大家分享一下----开心 1.文件流 2.几种文件操作函数 (1)  fopen (2) fclose (3)fread (4)fwrite (5)fgets (6)fputs 先来看FILE结构体: #ifndef _FILE_DEFINED struct _iobuf { char *_ptr;//文件缓存的当前位置 int _cnt;//缓存里可以读取的字节数 char *_base;//文件缓存的起始位置 int _flag; int