Чтение из файла в структуру C ++ [дубликат]

По состоянию на 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] enter image description here [/g1]

10
задан Mr. Phil 8 May 2013 в 19:12
поделиться

4 ответа

Вы можете следить за этим ответом , чтобы увидеть много разных способов обработки 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().

14
ответ дан Community 22 August 2018 в 01:27
поделиться
  • 1
    спасибо, я посмотрю – Mr. Phil 8 May 2013 в 19:00
  • 2
    @FilipeGama: Вы попробовали мое исправление? – jxh 8 May 2013 в 19:32
  • 3
    Да, второй работал :) Спасибо, как я сказал в другом ответе, я бы поднял, но не могу, потому что не хватает очков – Mr. Phil 8 May 2013 в 21:44
  • 4
    @ user315052: Есть два вопроса: (A) разделитель, упомянутый в ответах, и (B), вы проверяете, был ли вход действительным в неправильном месте. Если вы исправите A, это приведет к дублированию последней строки. – Mooing Duck 8 May 2013 в 22:36
  • 5
    @MooingDuck: Хороший улов, исправляющий мой ответ. – jxh 8 May 2013 в 22:44

Ваш 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


}
1
ответ дан 6 revs 22 August 2018 в 01:27
поделиться
  • 1
    Если это не 3 цикла, как это отображает 2-я и 3-я строки (даже без куттов? Извините, я изо всех сил пытаюсь понять эти концепции .csv, заранее заблаговременное редактирование: если бы вы могли отредактировать мой код и опубликовать его здесь, я бы очень благодарен :) – Mr. Phil 8 May 2013 в 18:40
  • 2
    Это сработало, но теперь я получил это: dl.dropboxusercontent.com/u/4613740/console2.png Он по какой-то причине повторяет последнюю строку ... – Mr. Phil 8 May 2013 в 18:44
  • 3
    Опять же, это будет хорошо работать только для 1-й линии, другие - это просто испортить ... таким образом: dl.dropboxusercontent.com/u/4613740/console3.png – Mr. Phil 8 May 2013 в 19:10
  • 4
    Не заметили запятые, все еще: dl.dropboxusercontent.com/u/4613740/console4.png Повторяет последнюю строку и вставляет новые строки перед ID :( это заставляет меня орехами ... – Mr. Phil 8 May 2013 в 19:20
  • 5
    Я скорректировал код и csv (раньше у меня не было компилятора). Повторяющиеся строки связаны с пустой строкой в ​​конце вашего .csv – Ian Jenkins 8 May 2013 в 22:02

csv-файл похож на любой другой файл на поток символов. getline считывает из файла до разделителя, однако в вашем случае разделитель для последнего элемента не является «', как вы предполагаете

getline(file, genero, ' ') ; 

, это новая строка\n

, поэтому измените эту строку на

getline(file, genero); // \n is default delimiter
7
ответ дан Anders K. 22 August 2018 в 01:27
поделиться
  • 1
    Только то, что я хотел написать, так +1. Этот код не ищет символ новой строки, что приводит к тому, что остальные не будут правильно разбираться. – Refugnic Eternium 8 May 2013 в 19:16
  • 2
    спасибо, что решил проблему, наконец :) Я бы проголосовал за вас, но не хватает очков, так вот мой комментарий, gratz – Mr. Phil 8 May 2013 в 19:26
  • 3
    @FilipeGama «upvote» - это не единственный способ сказать «Спасибо». Принятие их ответа - еще один совершенно правильный способ оценить их усилия. – Refugnic Eternium 8 May 2013 в 19:29
  • 4
    np Filipe, просто рад помочь – Anders K. 8 May 2013 в 21:17
  • 5
    на самом деле можно изменить принятый ответ :) – Anders K. 9 May 2013 в 15:21

Из-за того, что ваш файл 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
-2
ответ дан Freeman Zhang 22 August 2018 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: