在上一篇文章中思考了几个问题:
1 使用fputs向stdin中写入数据会发生什么
2 使用可读可写模式打开一个文件,然后调用fread和fwrite若干次后,缓冲区是如何变化的
#include <stdio.h>
#include <stdlib.h>
void printbuf(FILE *myfile){
printf("read buffer base %p\n", myfile->_IO_read_base);
printf("read buffer length %d\n", myfile->_IO_read_end - myfile->_IO_read_base);
printf("read buffer ptr %p\n", myfile->_IO_read_ptr);
printf("write buffer base %p\n", myfile->_IO_write_base);
printf("write buffer length %d\n", myfile->_IO_write_end - myfile->_IO_write_base);
printf("write buffer ptr %p\n", myfile->_IO_write_ptr);
printf("buf buffer base %p\n", myfile->_IO_buf_base);
printf("buf buffer length %d\n", myfile->_IO_buf_end - myfile->_IO_buf_base);
}
int main(){
char buf[5];
char *str = "lwl";
FILE *myfile = NULL;
myfile = fopen("myfile.txt","a+");
if(NULL == myfile){
printf("open file error\n");
exit(0);
}
fgets(buf,5,myfile);
printf("after fgets\n");
printbuf(myfile);
fputs(str,myfile);
printf("after fputs\n");
printbuf(myfile);
return 0;
}
假设myfile.txt中的初始数据如下:
lwl@lwl:~/Documents/iotest$ od -A d -c myfile.txt
0000000 1 2 3 4 5 6 7 8 9 0 \n a b c d e
0000016 f g h i j \n 9 8 7 6 5 4 3 2 1 0
0000032 \n q w e r t y u i o p \n
0000044
可以看出共有44个字符,执行程序,输出如下:
after fgets
read buffer base 0xb7766000
read buffer length 44
read buffer ptr 0xb7766004
write buffer base 0xb7766000
write buffer length 0
write buffer ptr 0xb7766000
buf buffer base 0xb7766000
buf buffer length 4096
after fputs
read buffer base 0xb776602c
read buffer length 0
read buffer ptr 0xb776602c
write buffer base 0xb7766004
write buffer length 4092
write buffer ptr 0xb7766007
buf buffer base 0xb7766000
buf buffer length 4096
此时,myfile.txt中的内容如下:
lwl@lwl:~/Documents/iotest$ od -A d -c myfile.txt
0000000 1 2 3 4 5 6 7 8 9 0 \n a b c d e
0000016 f g h i j \n 9 8 7 6 5 4 3 2 1 0
0000032 \n q w e r t y u i o p \n l w l
0000047
多了三个字符lwl,在执行程序,输出如下:
after fgets
read buffer base 0xb77ca000
read buffer length 47
read buffer ptr 0xb77ca004
write buffer base 0xb77ca000
write buffer length 0
write buffer ptr 0xb77ca000
buf buffer base 0xb77ca000
buf buffer length 4096
after fputs
read buffer base 0xb77ca02f
read buffer length 0
read buffer ptr 0xb77ca02f
write buffer base 0xb77ca004
write buffer length 4092
write buffer ptr 0xb77ca007
buf buffer base 0xb77ca000
buf buffer length 4096