2010-01-17 35 views
2

嘿,我真的不知道在標題中怎麼稱呼這個錯誤,所以在這裏。Ofstream把錯誤的東西寫入文件

我開始了一個任務,我必須讀取文件的內容,執行一些計算並將內容+新計算寫入文件。

我編寫了讀取文件的代碼,並立即將其寫入輸出文件以測試讀取是否正確發生。正如我所做的那樣,我看到ofstream在隨機位置將文件的「filename」字符串(用於要求用戶輸入要打開的文件的名稱)寫入文件中,並且在代碼中沒有提及它。

這是我的代碼:

#include <string> 
    #include <fstream> 
    #include <vector> 
    #include <iostream> 
    using namespace std; 

    int main() 
    { 
    char filename[256] = ""; 
    char currentLine[256] = ""; 

    cout << "Please enter the name of the input file: " << endl; 
    cin.getline(filename,256); 

    vector <string> storage;//disregard for now 

    ifstream infile; 
    infile.open(filename); 

    string outputFile = ".output"; 
    outputFile = filename + outputFile; 

    ofstream outfile(outputFile.c_str()); 

    string line = ""; 
    while(!infile.eof()) 
    { 
     infile.read(currentLine, 256); 
     line = currentLine; 
     storage.push_back(line); //disregard for now 
     outfile << line; //testing to see if it read properly 
    } 
    } 

這裏是輸入文本:

1034 BLUE ELECTRIC FROBULATOR 5 1026
1039綠色電FROBULATOR 10 1026
1054 BLUE ELECTRIC DEFROBULATOR(鎂COATING) 7 2000
1069 JELLO HAMMER V2 111 12
1050 BELL SILENCER 0 50
1090 S納克OIL 34 150
1070機械哥吉拉COSTUME(PINK)1 5000
1090 REFROBULATOR 3 9999
1091 REFROBULATOR REFILL(5 PACK)1 4999
1092 REFROBULATOR REFILL(OF 10 PACK)1個8999
2003 FROBULATION TODAY( MAR)4 5
2004 FROBULATION TODAY(APR)9 5
2005 FROBULATION今日(五月)2 5
3102 FROBULATOR客戶保修2YR 3 199
3103 FROBULATOR客戶保修3YR 3 299

,這裏是輸出文本:

1034 BLUE ELECTRIC FROBULATOR 5 1026
1039綠色電FROBULATOR 10 1026
1054 BLUE ELECTRIC DEFROBULATOR(鎂COATING)7 2000
1069 JELLO錘V2 111 12
1050 BELL消音0 50
1090蛇油34 150
1070機械哥吉拉COSTUME(PINK)1 5000
1090 Rinvoice.txtEFROBULATOR 3 9999
1091 REFROBULATOR REFILL(5 PACK)1個4999
1092 REFROBULATOR REFILL(OF 10 PACK)1個8999
2003 FROBULATION TODAY(MAR)4 5
2004 FROBULATION TODAY(APR)9 5
2005 FROBULATION今日(五月)2 5
3102製造商客戶擔保2年 3103發票。txtFROBULATOR客戶保修3YR 3 299
FILL(5 PACK)1 4999
1092 REFROBULATOR REFILL(OF 10 PACK)1個8999
2003 FROBULATION TODAY(MAR)4 5
2004 FROBULATION TODAY(APR)9 5
2005年FROBULATION今日(五月)2 5
3102 FROBULATOR客戶保修2YR 3 199
3103 invoice.txt

正如你可以看到 「invoice.txt」 不應該在輸出中。現在我錯過了什麼?

+0

你確定當你開始.output文件是空的嗎? – MadcapLaugher 2010-01-17 21:18:22

+0

順便說一句 - 你將被讚揚寫作更清晰的家庭作業相關的問題,我曾經見過一段時間。 – dmckee 2010-01-17 21:20:54

+1

無所謂 - 它會被覆蓋。但他應該檢查它是否正確打開。 – 2010-01-17 21:21:20

回答

3

一行地讀取文件行的​​正確方法是:

string line; 
while(getline(file, line)) { 
    // do something with line 
} 

對於爲什麼會是這樣,你可能想看看我的this blog post

+0

非常感謝,我現在要讀它,讓你知道它是如何出現的。 – dannyzlo 2010-01-17 21:30:10

+0

謝謝!這固定它,我學會了一個最佳實踐,所以雙謝! – dannyzlo 2010-01-17 21:41:50

2

我覺得你的問題是在這裏:

infile.read(currentLine, 256); 

,因爲我注意到,read

是一個未格式化的輸入功能,什麼是提取不存儲爲一個C字符串格式,因此沒有結尾的空字符被附加在字符序列的末尾。

所以,當你去複製currentLine,拷貝走馬上一端插入其他任何在內存中存在,這恰好是filename