关于C的FILE结构体
今天调试程序的时候看了一下FILE结构体的成员
_ptr
_cnt
_base
_flag
_file
_charbuf
_bufsize
_tmpfname
我定义了一个FILE *fin=fopen("input.txt","r");
发现_ptr值的前几位是我的文件里的值,后面全部是屯屯屯;
定义一个FILE *fout=fopen("output.txt,"w");
发现_ptr全部是屯屯屯,在进行了数据的写出后仍全是屯屯屯。
但是我的文件的读写是成功的。
求大神解释一下这个问题。
最好能告诉我FILE结构体各个成员分别表示什么意思,
取值有什么含义(比如_flag=1代表什么意思)。
[解决办法]
屯屯屯。。一般都是未初始化的缘故,还有那个啥烫烫烫烫烫烫。。。。
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(应该是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件的大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
[解决办法]
char *_ptr; //文件输入的下一个位置
你既然知道这个结构体的具体意思, 怎么就不仔细看呢?
明明说了是"下一个位置", 那肯定是看不到你才写入的东西的.
但是, 如果你打开一个已经写入了很多东西的文件, 这个指针应该是有文件内容的.
fopen是一个库函数, 并不是API
fopen封装了API, 并且_ptr指向的是一个文件缓冲区而不是一个字符串,虽然是char*类型, 只是为了按1字节计算,定义成char*. 所以这个指针指向的内容并不一定有\0结尾, 但调试的时候,调试器中显示是把char*看作串的给你显示, 所以就会看到乱码了.
就跟你自己申请的一个char数组, 但是不给它放\0结尾, 效果是一样的.