не получить выход из парсера .csv

0

Следующий код должен принимать имя файла, например "example.csv", и выводить 2D-массив.

typedef vector<vector<double> > matrix;

matrix importcsv(string filename)
{
    ifstream myfile (filename);
    matrix contents {{0.0}}; 
    char parens; double data; int i,j;
    while(!myfile.eof())
    {
        if(myfile.get()==',')
        {
            ++j; 
            contents[i].resize(j+1); 
            myfile >> parens;
        }
        else if(myfile.get()=='\n')
        {
            ++i; 
            contents.resize(i+1);
            j=0; 
            contents[i].resize(j+1);
        }
        else
        {
            myfile >> data; 
            contents[i][j]=data;
        }
    }
    return contents;
}

ВЫПУСК: компилятор работает плавно, но исполняемый файл ничего не возвращает.

Когда я выписываю цикл вручную, т.е. Посредством повторения кода вручную с помощью Ctrl + V, функция работает так, как ожидалось. Таким образом, ошибка должна быть где-то в синтаксисе "if" или "else if"...

  • 0
    Вы пытались его отладить? Например, добавление точек останова (или сообщений cout, таких как «Я получил это далеко»), чтобы увидеть, выполняется ли код?
  • 0
    The compiler runs smoothly, but the executable returns nothing. Что вы подразумеваете под "компилятор работает без сбоев"? Предполагается, что он «работает без сбоев», иначе вы не сможете создать исполняемый файл.
Теги:
csv

1 ответ

2
Лучший ответ

Кажется, я знаю, в чем проблема. В ваших myfile.get() if myfile.get() фактически читает символ, а не просто проверяет, что представляет собой следующий символ.

Поэтому, если следующий символ - это новая строка, первый оператор if получит его, но будет ложным, второй, если также будет недействительным, поскольку предыдущий, если он уже употреблял символ новой строки.

Сделайте что-то вроде:

    char c = myfile.get();
    if(c == ',')
    {
        ++j; 
        contents[i].resize(j+1); 
        myfile >> parens;
    }
    else if(c=='\n')
    {
        ++i; 
        contents.resize(i+1);
        j=0; 
        contents[i].resize(j+1);
    }
    else
    {
        myfile >> data; 
        contents[i][j]=data;
    }
  • 0
    ах - проницательно! Я боролся за интуицию с тем, что на самом деле делает функция myfile.get ()
  • 0
    На cplusplus.com есть действительно хорошая документация. Я использую это для всего. Вот документация для функции get : cplusplus.com/reference/istream/istream/get

Ещё вопросы

Сообщество Overcoder
Наверх
Меню