2

簡単にするために、ifstreamクラスとそのgetline()メンバー関数を使用してCSVファイルのコンテンツを読み取ろうとしています。これがこのCSVファイルです:

1,2,3
4,5,6

そしてコード:

#include <iostream>
#include <typeinfo>
#include <fstream>

using namespace std;

int main() {
    char csvLoc[] = "/the_CSV_file_localization/";
    ifstream csvFile;
    csvFile.open(csvLoc, ifstream::in);
    char pStock[5]; //we use a 5-char array just to get rid of unexpected 
                    //size problems, even though each number is of size 1
    int i =1; //this will be helpful for the diagnostic
    while(csvFile.eof() == 0) {
        csvFile.getline(pStock,5,',');
        cout << "Iteration number " << i << endl;
        cout << *pStock<<endl;
        i++;
    }
    return 0;
}

getlineは、最後の読み取り以降に書き込まれたものを取得し、「、」、または「\ n」に遭遇すると停止することを想定しているため、すべての数値が読み取られることを期待しています。

しかし、「4」、つまり2行目の最初の数字(コンソールを参照)を除いて、すべてをうまく読み取るようです。

Iteration number 1
1
Iteration number 2
2
Iteration number 3
3
Iteration number 4
5
Iteration number 5
6

したがって、私の質問:getlineがそれを考慮に入れようとさえしないほど(私が推測する)'\ n'の後にこの'4'を作るのはなぜですか?

(ありがとうございました !)

4

3 に答える 3

6

カンマ区切りの値を読み取っているので、順番に次のように読み取ります:1、、、、、。23\n456

1次に、配列2の最初の文字3を毎回出力します。つまり5、、、、、、6

何を期待していましたか?

ちなみに、あなたのチェックeofは間違った場所にあります。getline呼び出しが成功するかどうかを確認する必要があります。特定のケースでは、何かを読み取り、EOFをすべて1つのアクションでトリガーするため、現在のところ違いはありませんgetlineが、通常、何も読み取らずに失敗する可能性があり、現在のループはpStock正常に再入力されたかのように処理されます。

より一般的には、このようなものの方が良いでしょう:

while (csvFile.getline(pStock,5,',')) {
    cout << "Iteration number " << i << endl;
    cout << *pStock<<endl;
    i++;
}
于 2010-08-18T10:54:25.173 に答える
3

私の知る限り、ターミネーターパラメーターを使用するgetline()と、区切り文字が見つかるまで読み取ります。つまり、あなたの場合、それは読んだことを意味します

3\n4

配列pSockに入れますが、最初の文字3のみを出力するため、取得するのは.

于 2010-08-18T10:51:50.153 に答える
1

コードの問題は、区切り文字が指定されている場合、getlineがそれを使用し、デフォルトの区切り文字'\n'を無視することです。そのファイルをスキャンする場合は、トークン化機能を使用できます。

于 2010-08-18T10:56:35.193 に答える