По состоянию на JSF 2.x есть 4 боковых области:
- @SessionScoped
- @RequestScoped
- @ApplicationScoped
- @ViewScoped
Сфера сеанса: область сеанса сохраняется с момента установления сеанса до завершения сеанса. Сеанс завершается, если веб-приложение вызывает метод invalidate объекта HttpSession или время его истечения.
RequestScope: область запроса недолговечна. Он начинается, когда HTTP-запрос отправляется и заканчивается после отправки ответа клиенту. Если вы поместите управляемый компонент в область запроса, с каждым запросом создается новый экземпляр. Стоит рассмотреть область запроса, если вас беспокоит стоимость хранения области сеанса.
ApplicationScope: область применения сохраняется на весь срок действия веб-приложения. Эта область распределяется между всеми запросами и всеми сеансами. Вы размещаете управляемые компоненты в область приложения, если один компонент должен быть общим для всех экземпляров веб-приложения. Компонент создается, когда он сначала запрашивается любым пользователем приложения, и он остается в живых до тех пор, пока веб-приложение не будет удалено с сервера приложений.
ViewScope: область просмотра добавлена в JSF 2.0. Объект с видимым компонентом сохраняется, пока страница с JSF повторно отображается. (Спецификация JSF использует термин term для страницы JSF.) Как только пользователь переходит на другую страницу, компонент не работает.
Выберите область действия, основанную на ваших требованиях.
blockquote>Источник: Core Java Server Faces 3rd Edition от David Geary & amp; Кей Хорстманн [Стр. 51 - 54] [/g1]
Вы можете следить за этим ответом , чтобы увидеть много разных способов обработки CSV в C ++.
В вашем случае последний вызов getline
фактически помещает последнее поле первой строки, а затем все остальные строки в переменную genero
. Это связано с тем, что до конца файла не существует разделителя пространства. Попробуйте вместо этого заменить символ пробела на новую строку:
getline(file, genero, file.widen('\n'));
или более лаконично:
getline(file, genero);
Кроме того, ваша проверка на file.good()
преждевременна. Последняя строка в файле все еще находится во входном потоке, пока она не будет отброшена следующим вызовом getline()
для ID
. Именно в этот момент обнаружен конец файла, поэтому проверка должна основываться на этом. Вы можете исправить это, изменив свой тест while
на основе вызова getline()
для самого ID
(при условии, что каждая строка хорошо сформирована).
while (getline(file, ID, ',')) {
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero);
cout << "Sexo: " << genero<< " " ;
}
Для лучшей проверки ошибок вы должен проверить результат каждого вызова на getline()
.
Ваш csv искажен. Выход не три цикла, а только один выход. Чтобы убедиться, что это один цикл, добавьте счетчик и увеличивайте его с каждым циклом.
Это то, что ваш код видит
0,Filipe,19,M\n1,Maria,20,F\n2,Walter,60,M
Попробуйте это
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
while(file.good())
{
getline(file, ID, ',');
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero) ; \\ diff
cout << "Sexo: " << genero;\\diff
}
csv-файл похож на любой другой файл на поток символов. getline считывает из файла до разделителя, однако в вашем случае разделитель для последнего элемента не является «', как вы предполагаете
getline(file, genero, ' ') ;
, это новая строка\n
, поэтому измените эту строку на
getline(file, genero); // \n is default delimiter
Из-за того, что ваш файл csv находится в недопустимом формате, возможно, разрыв строки в текстовом файле не является\n или\r
, а использование c / c ++ для анализа текста - не очень хорошая идея , попробуйте awk:
$awk -F"," '{print "ID="$1"\tName="$2"\tAge="$3"\tGender="$4}' 1.csv
ID=0 Name=Filipe Age=19 Gender=M
ID=1 Name=Maria Age=20 Gender=F
ID=2 Name=Walter Age=60 Gender=M