0

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

#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 使用了三个不同的缓冲区,你能告诉我我的测试有什么问题吗?任何帮助将不胜感激。

4

2 回答 2

0

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

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

C11 7.21.3 文件

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

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

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

于 2013-08-09T10:27:03.167 回答
0

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

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

您的程序运行良好。

于 2013-08-09T10:36:01.970 回答