簡體   English   中英

為什么在stdin流緩沖區只有1024個字節的情況下scanf可以讀取超過1024個字符?

[英]Why scanf can read more than 1024 character while stdin stream buffer is 1024 bytes only?

我可以通過APUE的代碼獲取在Ubuntu下連接我的終端的stdin流緩沖區大小和緩沖區類型:

#include "apue.h" //It's merely a wrapper header

void    pr_stdio(const char *, FILE *);
int     is_unbuffered(FILE *);
int     is_linebuffered(FILE *);
int     buffer_size(FILE *);

int
main(void)
{
    FILE    *fp;

    fputs("enter any character\n", stdout);
    if (getchar() == EOF)
        err_sys("getchar error");
    fputs("one line to standard error\n", stderr);

    pr_stdio("stdin",  stdin);
    pr_stdio("stdout", stdout);
    pr_stdio("stderr", stderr);

    if ((fp = fopen("/etc/passwd", "r")) == NULL)
        err_sys("fopen error");
    if (getc(fp) == EOF)
        err_sys("getc error");
    pr_stdio("/etc/passwd", fp);
    exit(0);
}

void
pr_stdio(const char *name, FILE *fp)
{
    printf("stream = %s, ", name);
    if (is_unbuffered(fp))
        printf("unbuffered");
    else if (is_linebuffered(fp))
        printf("line buffered");
    else /* if neither of above */
        printf("fully buffered");
    printf(", buffer size = %d\n", buffer_size(fp));
}

int
is_unbuffered(FILE *fp)
{
    return(fp->_flags & _IO_UNBUFFERED);
}

int
is_linebuffered(FILE *fp)
{
    return(fp->_flags & _IO_LINE_BUF);
}

int
buffer_size(FILE *fp)
{
    return(fp->_IO_buf_end - fp->_IO_buf_base);
}

從我得到的終端運行上面的代碼: stream = stdin, line buffered, buffer size = 1024


然后我寫一個測試:

#include "stdio.h"

int main(){
    char c[2048];
    c[1033] = 'a';
    scanf("%s", c); //I paste 1440 '1' into the terminal.
    printf("%c", c[1033]); //I expect it to be 'a'.
    return 0;
}

我將1440(> 1024字節)字符'1'粘貼到終端,並期望多余的輸入數據將以某種方式被丟棄,因為行緩沖區大小僅為1024字節。 但最終,我在c[1033]打印了“ 1”。

為什么在stdin緩沖區大小僅為1024B時scanf可以讀取超過1024個字符?

引用APUE

我們可以看到,該系統的默認設置是在將標准輸入和標准輸出線連接到終端時進行緩沖。 行緩沖區為1,024字節。 請注意,這並不將我們限制在1,024字節的輸入和輸出行上。 那只是緩沖區的大小。 將2048字節的行寫入標准輸出將需要兩次寫入系統調用。

或者也許我應該問如何?

我不太理解強調的文字。 緩沖區不限制用戶輸入的大小嗎? 為什么說我可以輸入多個緩沖區大小的數據( 對於每個輸入 )? 有人可以告訴我它是如何工作的嗎?

如注釋中所述,當scanf()到達第一個緩沖區已滿時,如果仍然需要更多數據,它將返回系統以獲取更多(可能很多次)。 緩沖區僅僅是一種便利和優化措施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM