关于标准C中的fopen的使用心德!
好久没写程序,昨天帮朋友写个小程序,识别数码相片的信息。结果碰了一暗桩!
框架和过程如下:
1、选择目录
2、自动检索该目录下的所有JPG文件,并将文件名加入到TListView中。
3、循环读出TListView中的项,加入之前打开的目录,组成全路径,然后打开文件进行处理。
处理过程写成子函数,打开/关闭文件操作在上级函数完成,调用子函数时传递文件指针和字符数组,子函数的操作结果通过返回一个 int 值反映,有用的信息通过字符数组返回。在子函数内只实现读取内容并作判断处理。其中用到一个自定义结构,结构声明在头文件完成,变量定义在子函数内。结果就出问题了。
typedefine struct _fInfo{
WORD ID;
DWORD Content;
} fInfo;
当变量定义成指针 fInfo *buf 时,fread(buf,6,1,文件指针)后,作一系列的处理后返回。结果发现第一个文件处理成功,但之后的文件都出现打开文件错误,返回的文件指针都是NULL。
后来单步跟踪,逐段屏蔽代码进行测试,结果发现一执行过读内容到结构中后返回就出错,想来想去不明白,后来无意中把结构变量buf改成非指针的直接变量,然后在实际读内容时换成 fread(&buf,6,1,文件指针) 后就再没有出现之前的错误了。
分析过后,发觉是对C中的变量类型研究不透,指针变量只是一个地址而非实际存放内容的容器。而且C中很多函数要求的是一个const类型的指针。
此经历后有几点心德:
1、文件打开函数尽量使用全路径的文件名
2、C中使用指针前必须进行初始化,即赋值,否则会出现你意想不到的情况。
3、可以的情况下使用实际变量比使用指针来得安全和简便,在需要地址时用 & 运算符解决。
[解决办法]
指針未初始化。。。。
[解决办法]
你的指针是野指针,呵呵
fInfo *buf;只是声明了指针,你需要告诉它数据存放的具体位子
fInfo *pbuf;
pbuf=new fInfo;
然后使用下面一句,看看有没有出错
fread(buf,6,1,文件指针)