0

次の形式のテキスト ファイルを読み取るために使用している次のコード ブロックがあります。

firstname lastname id mark
firstname lastname id mark

以下はコードのブロックです。

void DBManager::ReadFile(void){
fstream myfile; /*fstream object that will be used for file input and output operations*/
char* fn;       /*pointer to the storage which will hold firstname*/
char* ln;       /*pointer to the storage which will hold lastname*/
int id;         /*integer var to hold the id*/
float mark;     /*float var to hold the mark*/

/*read in the filename*/
g_FileName = new char[1024];                /*allocate memory on the heap to store filename*/
cout << "Please enter the filename:";
    cin >> g_FileName;

/*open file*/
myfile.open(g_FileName, ios::in | ios::out);

if(myfile.is_open()){   /*check if the file opening is successful*/
    cout << "File reading successful !\n";

    /*read information from the file into temporary variables before passing them onto the heap*/
    while (!myfile.eof()) {

        fn=(char*) new char[1024];
        ln=(char*) new char[1024];
        myfile >> fn >> ln >> id >> mark;
        cout << fn << " " << ln << " " << id << " " << mark << " " << endl;

    }
    myfile.close();
}
else{                   /*else print error and return*/
    perror("");
    return;
}

}

上記のコードブロックは機能します! :)しかし、myfileが一度に1行を保持することになっていることをどのように認識しているか、および4つの変数の設定について十分にスマートであることに驚いています。

私は C++ が初めてなので、これは何らかのドキュメントでカバーされている可能性があります。しかし、あなたからの洞察や、fstreamオブジェクトをよりよく理解できる場所へのリンクをいただければ幸いです。

4

2 に答える 2

2

質問の意味がわかりません。ただし、コードにはいくつかの問題があります。

  1. 読み込もうとした後は、常に入力をチェックする必要があります。
  2. 読み取るものが他にあるかどうかを判断するためのテストはeof()機能しません。
  3. メモリ リークが発生し、すべてのイテレータにメモリが割り当てられています。
  4. 配列への制約なしの読み取りcharは安全ではありません。つまり、バッファのオーバーライド (主要な攻撃ベクトルの 1 つ) が発生しやすくなります。

次のようなループを使用します。

std::string fn, ln;
while (myfile >> fn >> ln >> id >> mark) {
     ...
}
于 2012-10-16T20:42:03.360 に答える
1

C++ では、std::fstream特にファイルに対して機能するストリームのタイプです。ファイルから読み取る場合、 のインターフェイスはstd::fstreamとほとんど同じですstd::cin>>入力ストリームは、オペレーターに尋ねられたときに次の単語または数字を読み取るようにプログラムされています。空白で区切られているため、単語と数字がどこにあるかがわかります。デフォルトのロケールでは、スペース、タブ、および改行は空白と見なされます。コンマなどの他の文字を含めるようにロケールを変更し、ファイルからの読み取り中にそれらをスキップすることができます。基本的に、入力ストリームで読み取る場合、改行とスペースは同じように扱われます。

ストリームについて学ぶための良い説明がここにあります: http://www.cprogramming.com/tutorial/c++-iostreams.html

于 2012-10-16T21:15:40.537 に答える