编程之路总是路漫漫其修远兮,吾将上下而求索。
借用CSDN某位的文章,成功修改错误
大概截图如下
源代码:
构造函数的返回类型规范无效
该函数为构造函数,无需在前面多加void
C中 #define PI 3.1415926
C++ const float/double PI=3.1415926
.cpp:(.rdata$.refptr._ZTV5Shape[.refptr._ZTV5Shape]+0x0): undefined
reference to `vtable for Shape’
意思为:Shape报错,定义有问题;
发现多写了抽象类函数的一个变量,导致出错;另外,对虚函数没有进行
virtual double MySpace();
更改为
virtual double Myapce()=0;
1.读取文件到另一个文件中,最后一次读取的数据会在写入的文件中出现两次,
解决办法:注意读取文件的最后一行不加换行符
#include
#include
#include
#include
using namespace std;
void WriteCommodity(const char* filenamea,const char* filenameb,string t) //将文件b中的内容传递给文件a
{
ifstream fpb(filenameb/*,ios::in*/); //读取文件b的内容,in 为输入(读)而打开文件
ofstream fpa(filenamea/*,ios::out*/); //将内容写入文件a, out 为输出(写)而打开文件
if(!fpb.good()&&!fpa.good())
{
cout<<"打开失败"<<endl;
return ;
}
else if(!fpb.good())
{
cout<<"打开失败"<<endl;
fpa.close(); //关闭文件a
return ;
}
else if(!fpa.good())
{
cout<<"打开失败"<<endl;
fpb.close(); //关闭文件b
return ;
}
string na,ty;
double pr;
int nu;
double di;
string ds;
while(!fpb.eof())
{
fpb>>na>>ty>>pr>>nu>>di>>ds;
if(na==t)
fpa<<na<<endl<<ty<<endl<<20.0<<endl<<nu<<endl<<di<<endl<<ds<<endl;
else
fpa<<na<<endl<<ty<<endl<<pr<<endl<<nu<<endl<<di<<endl<<ds<<endl;
}
fpa.close();
fpb.close();
return ;
}
void WriteUser(const char* filenamea,const char* filenameb,string t) //将文件b中的内容传递给文件a
{
ifstream fpb(filenameb,ios::in);
ofstream fpa(filenamea,ios::out);
string ac,name,pwd;
double bl;
int ty;
//注意,为了避免最后一次数据被读取两次,最后一行数据不要加换行符
while(!fpb.eof()) //使用eof判断会出现问题,文本的最后一次读取,读取了两次
// while(fpb.peek()!=EOF) //文本的最后一次读取,还是两遍
{
fpb>>ac>>name>>pwd>>bl>>ty;
if(ac==t)
fpa<<ac<<endl<<name<<endl<<pwd<<endl<<20.0<<endl<<ty<<endl;
else
fpa<<ac<<endl<<name<<endl<<pwd<<endl<<bl<<endl<<ty<<endl;
}
fpa<<"202004"<<endl<<"111"<<endl<<"222"<<endl<<20.0<<endl<<1<<endl;
fpa.close();
fpb.close();
return ;
}
int main()
{
WriteUser("temp.txt","user.txt","202002"); //将 temp.txt 文件内容读入 user.txt
// WriteCommodity("commodity.txt","temp.txt");
return 0;
}
2.读取文件模式总结
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式
不加app模式会直接覆盖原文件数据输出
3.状态标识符
bad()
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
fail()
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
eof()
如果读文件到达文件末尾,返回true。
good()
判断一个文件是否成功打开
注意:打开文件之后必须关闭文件;若文件未成功打开,由于没有返回句柄,无需关闭文件;
转载:本文链接:https://blog.csdn.net/weixin_44841414/article/details/106492264
1.swap函数
swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配: 必须是相同类型的容器,而且所存储的元素类型也必须相同。调用了swap函数后,右操作数原来存储的元素被存放在左操作数中,反之亦然。
vector svec1(10); //vector vith 10 elements
vector svec2(24); //vector with 24 elements
svec1.swap(svec2);
执行swap后,容器svec1中存储24个string类型的元素,而svec2则存储10个元素。
关于swap的一个重要问题在于:该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。
用法
void swap( basic_string &str );
swap()函数把str和本字符串交换。例如:
string first( “This comes first” );
string second( “And this is second” );
first.swap( second );
cout << first << endl;
cout << second << endl;
————————————————
原文链接:https://blog.csdn.net/weixin_45621943/article/details/10780410
vector清空元素的三种方法
#include
#include
using namespace std;
//STL vector的几种清空容器(删除)办法
void test()
{
vector<int> vecnum;
vecnum.push_back(1);
vecnum.push_back(2);
vecnum.push_back(3);
vecnum.push_back(4);
vecnum.push_back(5);
vecnum.push_back(6);
vecnum.push_back(7);
//打印vector的大小和容量
cout << "old: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;
//1. clear(),清空元素,但不回收空间
//vecnum.clear();
//2. 使用 erase循环删除,结果同上
//vector::iterator it;
//for (it = vecnum.begin(); it != vecnum.end(); )
//{
// //注意使用erase()方法时,迭代不要随意的++
// it = vecnum.erase(it);
//}
//结论:erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据,所以vector不适合做频繁删除的容器
//3. 最简单的使用swap,清除元素并回收内存
//3.1 写法一
//vector().swap(vecnum);
//3.2 写法二
vecnum.swap(vector<int>());
//打印vector的大小和容量
cout << "last: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;
}
int main()
{
test();
getchar();
return 0;
}
转自:https://www.cnblogs.com/zhanggaofeng/p/9338681.html