2011-06-25 79 views
4

免責聲明:這個問題直接關係到我的編程作業。C++從文件讀取數據

我的C++任務包括打開一個.txt文件,對其執行一堆操作,然後保存.txt文件。問題是,我很難理解讀取和寫入文件的基本概念。

我的代碼:

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

int main() { 
    ifstream inData; 
    ofstream outData; 

    // is it necessary to open datalist.txt for both the in and out streams? 
    inData.open ("datalist.txt"); 
    outData.open("datalist.txt"); 

    if (inData.is_open()) { 
     cout << "yay, i opened it\n"; // this outputs as expected 

     char fileData[100]; // have to use char arrays as per instructor. no strings 
     inData >> fileData; // store text from datalist.txt in fileData char array 
     cout << fileData; // nothing happens here... why? 

     outData << "changing file text cause I can"; // this works just fine. 
    } 
    else { 
     cout << "boo, i couldn't open it"; 
    } 

    inData.close(); 
    outData.close(); 

    return 0; 
} 

我現在遇到的主要問題是,我不知道如何在連基層一個文件中讀取數據,更不用說解析文件到相關信息(程序的目的是讀取,寫入和操作以分號分隔的列表中的信息)。

除了這個問題,我還對另外兩件事有些困惑。首先,是否有必要爲輸入和輸出流打開datalist.txt,出於某種原因,我感到很奇怪,我必須打開兩次相同的文件。其次,我的教師不希望我們使用字符串類,而是使用char數組。我不明白這背後的邏輯,並希望有人能詳細說明爲什麼(或者可能反駁爲什麼)字符串是壞的。

+1

背後的「邏輯」要求您以艱難的方式做一些事情,以便您有機會調查困難方式的工作方式。然而,我可能會認爲在C++中使用'char'數組是沒有根據的折磨。保存彙編語言類的直接內存操作。 –

+0

您可以做的一件事是將** i ** fstream和** o ** fstream decalration更改爲單個** f **流 – Tim

+0

您可以通過'while'循環中的行逐行讀取文件,方法是使用' readline'和一個臨時字符串。 – Blender

回答

3

您不會同時打開一個文件進行讀取和寫入。那麼,不要用兩個不同的對象來互相不瞭解對方。您可以使用std :: fstream(可以同時讀取和寫入),或者先讀取關閉文件,處理數據然後寫入。

另外:

//必須使用字符數組按照教練。沒有字符串

我想你可能想要一個更好的教練。使用裸集,基於堆棧的數組並不是任何值得他們認同的C++老師所認可的。

這是緩衝區溢出的來源。

+5

雖然我完全同意你的分析,但我必須說,使用char *數組的全部意義在於教會它如何在低層完成,以及爲什麼使用更現代的編碼更好。但要理解爲什麼有些不好,你必須經歷使用它的艱辛。 – Genzume

+0

對於低級編碼,使用C stdio會更好。 – zvrba

+1

@zvrba:我是否相信你,用戶詢問_iostreams_。由於這是作業,老師對他們能做的事情進行限制。所以你所提出的建議與其說是「回答」,不如說是「爲你最喜歡的IO模型改變方向」。 –

1

打開同一個文件,通過兩個不同的文件對象進行讀寫通常是一個糟糕的主意。就你而言,它也導致了(你的問題的一部分)。默認情況下,打開ofstream會截斷它。所以當你從inData讀取時,你什麼也得不到。這就是爲什麼沒有發生在這裏:

cout << fileData; // nothing happens here... why? 

最後,文件包含:

changing file text cause I can 

,別無其他。

因此,要閱讀該文件,您不能像打開文件那樣打開它。如果要將文件文本更改爲字符串,則可以簡單地執行兩個單獨的操作。打開inData,閱讀並關閉它。 現在打開outData,寫我們的字符串,並關閉它。另一方面,如果您想要將字符串附加到現有文件的末尾,則應該打開一個用於讀取和寫入的流。讀直到文件結束,然後文件指針仍然在最後,寫下你的字符串。

這就是基本的想法。更多的,我會做你的功課你。 :)