所有输入函数都使用相同的缓冲区吗?

时间:2013-08-09 10:23:41

标签: c

所有输入函数都使用相同的缓冲区吗?我在一本书中读到它它说所有输入函数在程序中使用相同的缓冲区。但是我做了一个测试,它表明可能是错的。我想知道我的测试有什么问题吗?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE    *fp1; 
    FILE    *fp2;
    char    ch;
    char    ch2;
    int d;

    scanf("%d", &d);

    fp1 = fopen("file1.c","r");
    fp2 = fopen("file2.c", "r");

    while((ch = getc(fp1)) != 'r')
        putchar(ch);
    putchar('\n');

    putchar(ch = getc(fp1));
    putchar('\n');

    while((ch2 = getc(fp2)) != 'n')
        putchar(ch2);
    putchar('\n');

    putchar(getc(fp1)); 
    putchar('\n');

    putchar(ch2 = getc(fp2));
    putchar('\n');

    putchar(getchar());
    putchar('\n');

    return 0;

}

file1.c的内容是:第一个

file2.c的内容是:第二个

当我输入时:12cd 输出是:

 the fi

 s

 the seco

 t

 d

 c

似乎file1.c file2.c和stdin使用了三个不同的缓冲区,你能告诉我我的测试有什么问题吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我认为这本书意味着从标准输入读取的所有函数都具有相同的缓冲区。

在您的示例中,您从不同的文件中读取,每个文件都有自己的流,因此它们将具有不同的缓冲区。

C11 7.21.3档案

  

通过打开,流与外部文件(可以是物理设备)相关联   文件,可能涉及创建新文件。

之后,该标准继续讨论如何处理具有不同缓冲区(完整,行或无缓冲)的流。显然缓冲区与流相关,而流与文件相关。

在C ++中,它是类似的。

答案 1 :(得分:0)

首先,我建议您为文本文件使用其他扩展名。

显然,您可以读取或写入不同的流或缓冲区。你写过的例子很好地证明了这一点。

你的程序运行得很好。