2009-11-09 50 views
1

我工作的一个程序,即需要在启动从文本文件加载数据和数据保存到退出时相同的文本文件。我有负载工作,我有保存工作,但由于某种原因,我似乎不能让他们都在同一个程序内工作。问题阅读,并从同一个程序中相同的文件写入... C++

这不工作...

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。

感谢

回答

2
ofstream savefile("test.txt"); 

等同于:

ofstream savefile; 
savefile.open("test.txt", ios::out|ios::trunc); 

也就是说,你当你打开它截断文件。因此,移动初始化savefile发生你与你的load调用来完成后(我建议尽可能晚地做这件事,因为如果你的初始化完成后崩溃,你就大功告成了保存前,保存文件已损坏 - 通常情况下一个写入不同的文件,并且只有当磁盘上的所有内容都安全时,重命名才会结束)。

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; 
} 
+0

我无法看到你包括'关闭'的文件在哪里? loadfile.close()和savefile.close()无处可查? – 2009-11-09 02:37:52

+3

当流对象超出范围时,这些文件将被关闭。 – user200783 2009-11-09 02:43:57

+1

这样可以避免在输入文件被读取之前将其打开 - 这很重要。 – 2009-11-09 04:19:50

1

在第一个样品,您可能正在运行触犯的操作系统文件锁定,阻止您打开同一个文件进行读取和写入。请记住在打开文件时总是打开check for failure

在第二个示例,你不倒回文件指针。在尝试读取之前使用seekg来重置流指针。请记住,虽然有一个单独的seekgseekp,在实践中,他们可能指的是同一个指针,所以它总是最好的读写之间切换前寻求。

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: “一旦该成员函数被调用时,该流对象可被用来打开另一个文件,并将该文件再次可用到其它进程打开”

+0

不需要调用close()。当loadfile超出作用域时,它会自动关闭。如果您特别想知道生成的异常,您应该只能使用close()。否则析构函数应该这样做。 – 2009-11-09 04:54:34

相关问题