2013-03-17 16 views
0

代碼:文件處理不工作在while循環

#include<iostream.h> 
#include<fstream.h> 
#include<string.h> 
int n = 0, flag = 0,i; 
struct bac 
{ 
    char name[10]; 
    char amt[5]; 
} s; 



void main() 
{ 
ofstream f("C:\\TC\\1.dat"); 
    for(i=0;i<10;i++) 
    { 

     cout << "\nenter the details "; 
     cin >> s.name >> s.amt; 

     f.write((char *)&s, sizeof(bac)); 
    } 
    } 

有時代碼工作正常 但在其他時候,當我看到在輸出文件中,它是空的,問題出現了很多次,我螞蟻知道是否有關於文件處理循環的預防措施

例如,在其他程序

..... 
while(ch!=4) 
     { 
     cout << "\nBANK MANAGEMENT SYSTEM \n"; 
     cout << "enter choice "; 
     cout << "\n1.add\n2.search\n3.delete and overwrite "; 
     cin >> ch; 
     if (ch == 1) 
     { 
       cout << "\nenter the details "; 
    cin >> s.name >> s.amt; 
    f.write((char *)&s, sizeof(bac)); 
     } 
    ..... 

文件是空

+0

如果它接受'iostream.h',你就有一個非常過時的編譯器。使用'',使用'',並使用''(除非你真的要用C字符串函數)。另外,使用'int main'。符合的實現只接受帶'int'返回類型的'main'。除了C風格的文件io,沒有理由將您的對象創建爲全局對象。保持在main()的本地。只要任何用戶決定輸入9或4個以上的字符,您的輸入也會失敗。 'std :: string'可以毫不費力地解決這個問題。 – chris 2013-03-17 14:56:25

+0

我同意,但它的編譯和主要問題是什麼可能導致這樣不同結果的問題? 偶數代碼#1使用相同的 *** iostream。h ***和*** void main()***但作品 – 2013-03-17 15:02:44

+0

它僅適用於您的編譯器不符合要求並且您使用非標準標頭。如果您希望自己的代碼與其他人的C++實現一起工作,那麼使用標準C++非常重要,所有符合實現的實現都一致。 – chris 2013-03-17 15:10:20

回答

1

我想你可能已經使用了比gcc 4.5.3更老的編譯器了。 我試過你的代碼,它沒有問題。

#include <iostream> //use header file without using deprecated iostream.h 
#include <fstream> //same reason as above 
#include <string> 

using namespace std; 


int n = 0, flag = 0,i; 
struct bac 
{ 
    char name[10]; 
    char amt[5]; 
} s; 



int main() //usually main returns int. void was kind of old now 
{ 
    ofstream f("test.txt"); 
    for(i=0;i<10;i++) 
    { 

     cout << "\nenter the details "; 
     cin >> s.name >> s.amt; 

     f.write((char *)&s, sizeof(bac)); 
    } 
    f.flush(); 
    f.close(); 

    return 0; 
} 

我編譯了gcc 4.5.3中的代碼並運行它。該文件包含我輸入的所有內容。 但是,在使用文件輸入/輸出流寫入文件時,最好使用< <運算符。

你可以找到,並從這個鏈接的上方的更多信息: http://members.gamedev.net/sicrane/articles/iostream.html

還有一點,聞你做寫入文件,記得要衝洗和關閉文件句柄,否則,有時會引起一些惱人的問題。

+0

thnx的信息,但它仍然沒有回答我的問題之一, – 2013-03-17 15:08:04

+1

@Siddhartha Sinha記住刷新並關閉文件,一旦你完成了寫作,這是可能是它爲什麼有時起作用的原因,有時它不起作用。 – taocp 2013-03-17 15:11:22

+0

精彩一個!!!!!!使用打開和關閉重複工作! – 2013-03-17 16:00:30

0

,因爲你使用的是C++,我建議你用一個正規的方式來使用ofstream的,在你的代碼,它應當與F < < s.name < < s.amt。

請記住,您正在使用C++,因此請繼續使用i/o流。

+0

寫入是ostream的成員。使用<<是一種方式,可以使用寫入功能 – taocp 2013-03-17 14:58:43

+0

但是y不是代碼2中的寫入功能? – 2013-03-17 15:00:50

+0

可能由您使用的char []類型引起,在這種情況下,您需要非常仔細地檢查內容,這裏可能會遇到太多情況。 – Yuqian 2013-03-17 15:06:31

1

該代碼似乎不是非常C++ - 對我來說... 要回答最後一個問題,沒有任何關於特定於循環的fstreams的細節,沒有。

我建議首先要做的f.write與成員nameamt自己的編譯器可能會添加名稱和AMT之間的填充,創建不必要的垃圾輸出。

你確定你有寫權限的文件路徑嗎?嘗試打開一個本地文件,就像路徑中的「1.dat」一樣。

也嘗試打開文件爲f("/* file name */", ofstream::out | ofstream::app)。 「out」將其設置爲輸出流,「app」將它添加到文件的末尾。 www.cplusplus.com/ofstream詳細介紹更多標誌。

+0

thnks的建議,但我想我可能剛剛找到解決方案 – 2013-03-17 16:01:32