1.动态创建二维数组的方法:
int**arrry;//4行五列
array = new int*[4];
for (int i = 0; i <= 3; i++)
array[i] = new int[5];
2.重载等号后,初始化第二个对象时可以用第一个对象
3.比较字符串a[20]与b[20]是否相等,用strcmp(a,b),而不是if(a[20]==b[20])
4.在同一个子函数里面打开文件后,循环后指针不会回到文件头,需要seek(seekg或者seekp,后面统称seek)重置。用seek之前一般要用clear()函数,把流的标记清除掉(还有各种错误标识)。
对于我个人而言,如果在一个循环执行完后还没有找到需要的结果,(第二个)循环之前就需要clear()和seek函数。
5.ios::app和ios::ate刚开始指针都指向文件尾,可是ios::app模式下不能更改指针位置而ios::ate可以.
6.要进行读写操作,只用ios::binary可能会read不进去而进入死循环,所以一般为 fstream file("filename",ios::binary | ios::in | ios::out)
7.文件每read后指针都会向下走一个,所以读到当前操作内存时,还要readfile.seekg(-(int)sizeof(contacts), ios::cur);需要的话之后还要readfile.seekg(sizeof(contacts), ios::cur)回来.
8.在一个子函数内,开头开一个文件,结尾关闭后,再开同一个文件,然后循环回来,对文件的操作可能会出错(毕竟不是同一个文件对象了).
9.判断文件是否读取完
正确的方法:
readfile.read((char*)&file, sizeof(contacts));
while (!readfile.eof())
{
if (strcmp(ad.name, file.name) == 0)//判断是否添加已有的人
{
cout << "已有该联系人,电话号码为:" << file.name<<endl;
fla++; break;
}
readfile.read((char*)&file, sizeof(contacts));
}
易错法:
while (!readfile.eof())
{
readfile.read((char*)&file, sizeof(contacts));
if (strcmp(ad.name, file.name) == 0)//判断是否添加已有的人
{
cout << "已有该联系人,电话号码为:" << file.name<<endl;
fla++;
break;
}
}
容易出错的地方在于read后,文件已经完毕,然而不能及时退出,可能再次执行一次if里面的内容,导致重复操作.