0

このコードを抽出して CSV ファイルを解析しましたが、最初の n-1 行の最初の要素を読み取りません。理由がわからず、データを新しい空のファイルにコピーしてCSVファイルとして保存すると、エラーが消えて正常に動作します。元の(エラーが発生する) CSV ファイルとコピーされた(エラーが発生しない) CSV ファイルのリンクを次に示します。なぜこれが起こっているのか、私を助けてもらえますか?

ありがとうございました。

#include <boost/tokenizer.hpp>
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>

int main(int argc, char** argv)
{
    using namespace std;

    if (argc != 2)
    {
        cerr << "Usage: " << argv[0] << " <csv file>" << endl;
        return -1;
    }

    vector< vector<string> > csv_values;

    fstream file(argv[1], ios::in);

    if (file)
    {
        typedef boost::tokenizer< boost::char_separator<char> > Tokenizer;
        boost::char_separator<char> sep(",");
        string line;

        while (getline(file, line))
        {
            Tokenizer info(line, sep);   // tokenize the line of data
            vector<string> values;

            for (Tokenizer::iterator it = info.begin(); it != info.end(); ++it)
            {
                // convert data into double value, and store
                values.push_back(it->c_str());
            }

            // store array of values
            csv_values.push_back(values);
        }
    }
    else
    {
        cerr << "Error: Unable to open file " << argv[1] << endl;
        return -1;
    }

    // display results
    cout.precision(1);
    cout.setf(ios::fixed,ios::floatfield);

    for (vector< vector<string> >::const_iterator it = csv_values.begin(); it != csv_values.end(); ++it)
    {

        const vector<string>& values = *it;

        for (vector<string>::const_iterator it2 = values.begin(); it2 != values.end(); ++it2)
        {
            cout << *it2 << " ";
        }
        cout << endl;
    }
}
4

1 に答える 1

0

元のファイルの新しい行は改行で終わります。これは、行の最後の変数でコードによって読み取られ、出力されます。したがって、最初の行は次のように印刷されます

1 2 3 4 5\r

次に、「1」をカバーする行の先頭に印刷されるスペースを印刷します。

デバッガーで簡単に確認できます:)

于 2016-08-17T18:21:46.810 に答える