используя getline(), в то время как разделение запятой не работает

92
15

Я прочитал CSV файл с символом окончания строки как "\ r", операция чтения выполнена успешно, но проблема началась, когда я передал строку чтения в то while(getline(ss,arr2,',')) для разделяющая запятая.. он корректно работает для первой строки, но все последующие итерации пустые (то есть) он не смог отделить запятую в строке.

int main()
{
cout<<"Enter the file path :";
string filename;
cin>>filename;
ifstream file;
vector<string>arr;
string line,var;
stringstream content;
file.open(filename.c_str(),ios::in );
line.assign((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
file.close();
string arr2;
stringstream ss;
content<<line;
//sqlite3 *db;int rc;sqlite3_stmt * stmt;
int i=0;
while (getline(content,var,'\r'))
{
ss.str(var);//for each read the ss contains single line which i could print it out.
cout<<ss.str()<<endl;
while(getline(ss,arr2,','))//here the first line is neatly separated and pushed into vector but it fail to separate second and further lines i was really puzzled about this behaviour.
{
arr.push_back(arr2);
}
ss.str("");
var="";
arr2="";
for(int i=0;i<arr.size();i++)
{
cout<<arr[i]<<endl;
}
arr.clear();
}
getch();
}

что пошло не так в вышеупомянутом... Я ничего не вижу прямо сейчас :(

спросил(а) 2015-12-21T12:52:00+03:00 4 года, 9 месяцев назад
1
Решение
69

Метод stringstream::str не сбрасывает/не очищает внутреннее состояние потока. После первой строки внутреннее состояние ss равно EOF (ss.eof() возвращает true).

Либо использовать локальную переменную внутри в while цикла:

while (getline(content,var,'\r'))
{
stringstream ss(var);

Или очистите поток до ss.str:

ss.clear();
ss.str(var);

ответил(а) 2015-12-21T13:09:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема