我正在开发一个程序,它需要在启动时从文本文件加载数据,并在退出时将数据保存到THE SAME文本文件。我有负载工作,我有保存工作,但由于某种原因,我似乎不能让它们都在同一个程序中工作。
这不起作用......
ifstream loadfile("test.txt");
ofstream savefile("test.txt");
void load()
{
string name;
while(!loadfile.eof())
{
getline(loadfile,name);
cout<<"name " << name<<"\n";
}
}
void save(User &name)
{
savefile << name.getName() << endl;
}
这也不是......
fstream file("test.txt");
void load()
{
string name;
while(! file.eof())
{
getline(file,name);
cout<<"name " << name<<"\n";
}
}
void save(User &name)
{
file << name.getName() << endl;
}
问题是,我可以保存一个名单列表,工作正常......但是一旦我启动程序,列表中的所有名称都会从文本文件中删除。
另外,我知道getline()从文本文件中获取数据作为字符串类型,但是如何将其转换为类似int的内容。
由于
答案 0 :(得分:3)
您的文件正在全局打开,永不关闭。尝试:
void load()
{
ifstream loadfile("test.txt");
string name;
while(!loadfile.eof())
{
getline(loadfile,name);
cout<<"name " << name<<"\n";
}
}
void save(User &name)
{
ofstream savefile("test.txt");
savefile << name.getName() << endl;
}
答案 1 :(得分:2)
ofstream savefile("test.txt");
相当于:
ofstream savefile;
savefile.open("test.txt", ios::out|ios::trunc);
也就是说,您在打开文件时截断了文件。因此,在完成savefile
调用之后,将load
的初始化移至(我建议尽可能晚地执行此操作,因为如果您在之后崩溃初始化和保存之前,保存文件已损坏 - 通常一个写入另一个文件,只有当磁盘上的所有内容都安全时才重命名。“
答案 2 :(得分:1)
在您的第一个示例中,您可能会遇到操作系统文件锁定,导致无法为读取和写入打开相同的文件。打开文件时请记住始终check for failure。
在第二个示例中,您不倒回文件指针。在尝试读取之前使用seekg
重置流指针。请记住,虽然有单独的seekg
和seekp
,但实际上它们可能引用相同的指针,因此在读取和写入之间切换之前最好先寻找。
答案 3 :(得分:1)
void load(){
ifstream loadfile("test.txt");
string name;
while(!loadfile.eof())
{
getline(loadfile,name);
cout<<"name " << name<<"\n";
}
loadfile.close(); // Call close() to free up resources again
}
void save(User &name)
{
ofstream savefile("test.txt");
savefile << name.getName() << endl;
savefile.close(); // Call close() to free up resources again
}
来自Cplusplus I/O: “一旦调用了这个成员函数,就可以使用流对象打开另一个文件,并且该文件可以再次被其他进程打开。”