2011-06-25 31 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; 
} 

私が遭遇してる主な問題は、私も基本的なレベルでファイル内のデータを読み、おろかにファイルを解析する方法を理解していないということです関連情報(プログラムの目的は、セミコロンで区切られたリストの情報を読み書きし、操作することです)。

この質問に加えて、私はもう2つのことについて少し混乱しています。まず、inalとoutの両方のストリームに対してdatalist.txtを開く必要があるのです。なぜなら何らかの理由で同じファイルを2回開く必要があるということがちょっと奇妙に感じられるからです。次に、私のインストラクターは文字列クラスを使用せず、その代わりにchar配列を使用します。私はこれの背後にある論理を理解しておらず、誰かが理由を詳しく述べることができればと思っています。

+1

ハードな方法が何であるかを尋ねる背後にある「論理」は、ハードな方法がどのように機能するかを調査する機会があるためです。しかし、おそらくC++での 'char'配列の使用は不当な拷問であると主張しています。アセンブリ言語クラスのダイレクトメモリ操作を保存します。 –

+0

あなたができることの1つは、** i ** fstreamと** o ** fstreamデカレーションを1つの** f **ストリームに変更することです – Tim

+0

'while'ループで' readline'と一時的な文字列です。 – Blender

答えて

3

ファイルを読み書きするときに同時に開くことはありません。まあ、どんな速度でも互いに知り合わない2つの異なるオブジェクトではありません。あなたはstd :: fstream(読み込みと書き込みを同時に行うことができます)を使うか、最初にファイルを閉じてを閉じてデータを処理してから書き込みます。また

//インストラクターごとに文字列を使用しなければなりません。いいえ文字列

私はあなたがより良いインストラクターを取得したいと思うかもしれないと思います。裸の、スタックベースのchar*配列の使用は、塩分の価値があるC++教師が保証するものではありません。

これは、バッファオーバーランの原因となります。

+5

私はあなたの分析に完全に同意しますが、char *配列を使用することの全体的なポイントは、それが低レベルでどのように行われたのか、そしてより現代的なコーディングを使用する方が良い理由を教えることです。しかし何が悪いのかを理解するためには、それを使うことの苦労を経験しなければなりません。 – Genzume

+0

低レベルのコーディングでは、C stdioを使うほうがずっと良いでしょう。 – zvrba

+1

@zvrba:あなたが信じているかどうかにかかわらず、ユーザーは_iostreams_について質問しました。宿題なので、教師はできることに制限を設けています。だからあなたが示唆していることは、あなたのお気に入りのIOモデルを改宗するほどの "答え"ではないということです。 –

1

2つの異なるファイルオブジェクトで同じファイルを開くと、というファイルが開かれるのは、一般的には考えにくいです。あなたの場合、それはあなたの問題の一部にもつながっています。デフォルトでは、ofstreamを開くとそれが切り捨てられます。だから、inDataから読むと何も得られません。何もここに起こらない理由は次のとおりです。終わり

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

、あなたのファイルが含まれています

changing file text cause I can 

何もないし。

ファイルを読むには、あなたが持っているように書き込むために開いてはいけません。あなたの文字列だけにファイルのテキストを変更する場合は、単に2つの別々の操作を行うことができます。 inDataを開き、それを読んで閉じます。 今度はを開き、outDataを開き、文字列を書いて閉じます。

一方、既存のファイルの最後に文字列を追加したい場合は、読み書き用に1つのストリームを開く必要があります。ファイルの終わりまで読み込み、最後にファイルポインタを置いて文字列を書いてください。

これは基本的な考えです。あなたの宿題はもうになります。 :)

関連する問題