Парсер CSV в C ++ не читает первый элемент

Я извлек этот фрагмент кода для анализа файла CSV, однако он не читает первый элемент для первых n-1 строк. Я не могу понять, почему, и когда я копирую данные в новый пустой файл и сохраняю их как файл 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;
}
}

0

Решение

Новые строки в вашем оригинальном файле заканчиваются возврат каретки, который читается вашим кодом с последней переменной в строке, а затем печатается. Итак, первая строка печатается так

1 2 3 4 5\r

а затем вы печатаете пробел, который печатается в начале строки, охватывающей «1».

Вы можете легко увидеть это в отладчике 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]