在同一程序中读取和写入同一文件的问题... C ++

时间:2009-11-09 02:22:58

标签: c++

我正在开发一个程序,它需要在启动时从文本文件加载数据,并在退出时将数据保存到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的内容。

由于

4 个答案:

答案 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重置流指针。请记住,虽然有单独的seekgseekp,但实际上它们可能引用相同的指针,因此在读取和写入之间切换之前最好先寻找。

答案 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: “一旦调用了这个成员函数,就可以使用流对象打开另一个文件,并且该文件可以再次被其他进程打开。”