C ++ Code Dumping «случайные» данные

0

Начну с того, что я достаточно полезен в качестве программиста C++. Однако я понимаю PHP и VBA, поэтому хорошо разбираюсь в аспектах основ программирования.

Поскольку я часто использую CSV в своей повседневной работе, я думал, что было бы хорошим учебным упражнением написать библиотеку, которая управляет CSV файлами.

Я написал эту функцию:

int getHeaders(ifstream & os, vector<string> & head2){
    string STRING;
    getline(os,STRING);
    cout << STRING << endl;
    STRING.erase(remove(STRING.begin(), STRING.end(), '\"'), STRING.end());
    string::iterator it = STRING.begin();
    int x = 0;
    for (int index = 0; it < STRING.end(); it++, index++) {
        if (*it == ',') {
            head2.push_back(STRING.substr(0,index));
            STRING.erase(0,index+1);
            cout << endl << head2[x];
            cout << endl << STRING;
            x++;
        }
    }
    return head2.size();
}

Вызывается следующим:

int addRowCount = 0;
vector<string> head1;

ifstream outfile;
outfile.open("default.csv", ios_base::app);

cout << getHeaders(outfile, head1) << endl;
cout << head1[0] << endl << head1[1] << endl;

Но когда я запускаю программу, программа просто сбрасывает нагрузку случайного мусора на консоль (и сбой приложения) Я использую окна, поэтому не могу использовать valgrind.

Кто-нибудь знает, почему это может произойти? Очевидно, что этот "дамп" - это не то, что я хочу, чтобы приложение выполняло. Я надеюсь, кто-то может указать на часть моего кода, которая заставит это произойти.

Заранее спасибо.

  • 1
    Похожие страницы : stackoverflow.com/questions/23047052/…
  • 0
    Как вы чувствуете, что это связано? Я не использовал никаких структур. Пожалуйста, имейте в виду, я новичок в C ++ и просто ищу некоторые указатели?
Показать ещё 6 комментариев
Теги:
codeblocks
dump
mingw

2 ответа

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

Таким образом, оказалось, что head2 [1] не установлен, поэтому это была какая-то утечка памяти.

Вот законченная функция после нескольких дополнительных поправок для рекомендаций в разделе комментариев:

int getHeaders(ifstream & os, vector<string> & head2){
    string STRING;
    getline(os,STRING);
    STRING.erase(remove(STRING.begin(), STRING.end(), '\"'), STRING.end());
    int strle = count(STRING.begin(),STRING.end(), ',') + 1;
    for(int x = 0; x != strle; x++){
        if (count(STRING.begin(), STRING.end(), ',') > 0) {
            head2.push_back(STRING.substr(0,STRING.find_first_of(',')));
        } else {
            head2.push_back(STRING.substr(0,STRING.length()));
        }
        STRING.erase(0,STRING.find_first_of(',')+1);
    }
    return head2.size(); 
}
  • 0
    Если люди собираются понизить этот ответ, не могли бы вы сказать мне почему?
  • 0
    Если вы заинтересованы в улучшении своих навыков в C ++, я бы посоветовал опубликовать ваш рабочий код в Code Review Stack Exchange . Кроме того, если вы еще этого не сделали, я бы взглянул на первый фрагмент кода из этого ответа . Это гораздо более чистый способ делать то, что вы пытаетесь сделать.
Показать ещё 1 комментарий
2

При вызове удаления на строку, итераторы в эту строку аннулируются, так что это ошибка, чтобы использовать it после вызова STRING.erase().

Подсказка. Когда вы смотрите документацию по методу класса, поддерживающего итераторы, следите за комментариями об аннулировании итераторов. На этой странице, например, прочитайте раздел " Iterator validity

[не связано с ответом, но проблема с стилем: использование ВСЕХ CAPS для имени переменной, такого как STRING, обычно считается плохим стилем в C и C++. Все имена кепок используются для # определенных символов]

Ещё вопросы

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