我正在閱讀APUE
並嘗試stdio.h中的內存流。不過,我對自動寫作機制感到非常困惑。'fseek()+ output'在C標準I/O庫存儲器流上行爲奇怪
這裏是APUE
上5.14 Memory Streams
說:
空字節在流中的當前位置寫每當我們增加了流的緩衝區的數據量和FCLOSE打電話,fflush,FSEEK,fseeko或fsetpos
我用下面的代碼,測試什麼意思做了一些實驗Increase the amount of data in the stream's buffer
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BSZ 48
int main(){
FILE *fp;
char buf[BSZ];
memset(buf, 'a', BSZ-2);
buf[BSZ-2] = '\0';
buf[BSZ-1] = 'X';
printf("Initial buffer content: %s\n", buf);
if ((fp = fmemopen(buf, BSZ, "w+")) == NULL){
fputs("fmemopen failed\n", stderr);
exit(-1);
}
fprintf(fp, "hello, world");
/* Confused Point Here !!! */
fflush(fp); //works as expected
//fseek(fp, 12, SEEK_SET); //strange behavior
printf("after fflush/fseek: %s\n", buf);
fprintf(fp, "hello, world2");
fclose(fp);
printf("after fclose: %s\n", buf);
exit(0);
}
在"hello, world"
的第一個輸出之後,flush()
和fseek()
都會自動寫入。
的行爲是「你好,世界」的第二輸出後的不同,並呼籲FCLOSE():由'\0'
,這是我所期待的
當我使用flush()
的"hello, world"
第二輸出如下:
初始緩衝內容:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
後fflush/FSEEK:你好,世界
後FCLOSE:您好,worldhello,world2
然而,當我切換到fseek(fp, 12, SEEK_SET)
,的"hello, world"
第二輸出後面沒有一個 '\ 0' 任何更多:
初始緩衝內容:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
後fflush/FSEEK:你好,世界
FCLOSE後:您好,worldhello,world2aaaaaaaaaaaaaaaaaaaaa
這意味着內存流不會將第二輸出作爲increasing the amount of data
。
我做這個實驗的SUSE Linux企業服務器11(x86_64的)SP1
你有關於任何想法?或者它實際上是一個系統的錯誤?
提前感謝。