Начну с того, что я достаточно полезен в качестве программиста 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.
Кто-нибудь знает, почему это может произойти? Очевидно, что этот "дамп" - это не то, что я хочу, чтобы приложение выполняло. Я надеюсь, кто-то может указать на часть моего кода, которая заставит это произойти.
Заранее спасибо.
Таким образом, оказалось, что 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();
}
При вызове удаления на строку, итераторы в эту строку аннулируются, так что это ошибка, чтобы использовать it
после вызова STRING.erase()
.
Подсказка. Когда вы смотрите документацию по методу класса, поддерживающего итераторы, следите за комментариями об аннулировании итераторов. На этой странице, например, прочитайте раздел " Iterator validity
[не связано с ответом, но проблема с стилем: использование ВСЕХ CAPS для имени переменной, такого как STRING, обычно считается плохим стилем в C и C++. Все имена кепок используются для # определенных символов]