2009-11-09 51 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

相關問題