书很快就看完了 这几天去助教了 才发现广看书没有什么用 书上看的理论当时看是记住了 可是在用的时候 或者是出现问题的时候就还是不会, 哪天去洪福校区助教 帮本科生改程序就给了我一个教训,
#include
<
stdio.h
>
struct hardWare ... {
int num1;
char name[30];
int num2;
float price;
} ;
int enterChoice( void ); // 选择要对清单进行的操作 //
void buildFile(FILE * ); // hard.dat不存在时新建一个 //
void textFile(FILE * ); // 可打印txt文件 //
void updateFile(FILE * ); // 更新清单已有某项 //
void newRecord(FILE * ); // 向清单添加新的项 //
void deleteRecord(FILE * ); // 消除清单已有某项 //
main()
... {
FILE * cfPtr;
int choice;
//没有打开文件需要新建//
if((cfPtr=fopen("d:/hardWare.dat","r+"))==NULL)...{
printf("File could not be opened.");
buildFile(cfPtr);
printf("what is the cfPtr");
}
else...{
while((choice=enterChoice())!=5)...{
switch(choice)...{
case 1:
textFile(cfPtr);break;
case 2:
updateFile(cfPtr);break;
case 3:
newRecord(cfPtr);break;
case 4:
deleteRecord(cfPtr);break;
}
}
}
fclose(cfPtr);//关闭文件//
return 0;
}
void buildFile(FILE * cfPtr)
... {
int i;
struct hardWare blank=...{0,"",0,0};
cfPtr=fopen("d:/hardWare.dat","w");
for(i=1;i<=100;i++)
fwrite(&blank,sizeof(struct hardWare),1,cfPtr);
// fclose(cfPtr);
printf("what is cfPtr value");
}
struct hardWare ... {
int num1;
char name[30];
int num2;
float price;
} ;
int enterChoice( void ); // 选择要对清单进行的操作 //
void buildFile(FILE * ); // hard.dat不存在时新建一个 //
void textFile(FILE * ); // 可打印txt文件 //
void updateFile(FILE * ); // 更新清单已有某项 //
void newRecord(FILE * ); // 向清单添加新的项 //
void deleteRecord(FILE * ); // 消除清单已有某项 //
main()
... {
FILE * cfPtr;
int choice;
//没有打开文件需要新建//
if((cfPtr=fopen("d:/hardWare.dat","r+"))==NULL)...{
printf("File could not be opened.");
buildFile(cfPtr);
printf("what is the cfPtr");
}
else...{
while((choice=enterChoice())!=5)...{
switch(choice)...{
case 1:
textFile(cfPtr);break;
case 2:
updateFile(cfPtr);break;
case 3:
newRecord(cfPtr);break;
case 4:
deleteRecord(cfPtr);break;
}
}
}
fclose(cfPtr);//关闭文件//
return 0;
}
void buildFile(FILE * cfPtr)
... {
int i;
struct hardWare blank=...{0,"",0,0};
cfPtr=fopen("d:/hardWare.dat","w");
for(i=1;i<=100;i++)
fwrite(&blank,sizeof(struct hardWare),1,cfPtr);
// fclose(cfPtr);
printf("what is cfPtr value");
}
代码很简单是关于文件的 就是查找文件如果没有就新建一个,有的话就对其进行一系列的操作, 问题出来了 当地一次执行程序的时候,编译没有问题 但是当程序快执行完时 出现运行时刻错误,当时不知道为什么 加上那边用的开发环境实在是用不惯 debug时观察变量很不方便 就说回来看看 今天一看恍然大悟 所犯的问题就是 林锐博士在书中花大笔墨提到的 指针作为函数形参的问题, 在这个程序中毛病出在函数bulidfile中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _cfPtr,编译器使 _cfPtr = cfPtr。如果函数体内的程序修改了_cfPtr的内容,就导致参数cfPtr的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_cfPtr申请了新的内存,只是把_cfPtr所指的内存地址改变了,但是cfPtr丝毫未变。所以主函数cfPtr任为NULL。所以在主函数中要重新赋值,或者用指向指针的指针修改. 好好在看一遍书,多调有问题的程序才是王道呀!!