С++ как читать файл и разделить его строки

90
10

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

Это мой код:

    #include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
ifstream geo;
string line;
geo.open("file.txt", ios::in );
istringstream* iss;
vector<string> tokens;

while(!geo.eof())
{
getline(geo ,line);
iss = new istringstream(line);
tokens = vector<string>(istream_iterator<string>(*iss),
istream_iterator<string>{});

for (auto i:tokens)
cout << i << ", " ;
}
}

Прямо сейчас мой код не компилируется, вероятно, из-за istringstream, и я получаю эту ошибку:

g++ -fPIC -Wall -std=c++1y 'root-config --cflags' -I./include -O2  'root-config --cflags --glibs'  obj/ClipperDraw.o obj/clipper.o bin/cliipperex.cpp -o exe/cliipperex 
bin/cliipperex.cpp: In function ‘int main():
bin/cliipperex.cpp:187:57: error: no matching function for call to ‘std::istream_iterator<std::basic_string<char> >::istream_iterator(<brace-enclosed initializer list>)
tokens = {istream_iterator<string>{istringstream(line)},
^
bin/cliipperex.cpp:187:57: note: candidates are:
In file included from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/iterator:66:0,
from bin/cliipperex.cpp:13:
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stream_iterator.h:72:7: note: std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(const std::istream_iterator<_Tp, _CharT, _Traits, _Dist>&) [with _Tp = std::basic_string<char>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int]
istream_iterator(const istream_iterator& __obj)
^
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stream_iterator.h:72:7: note: no known conversion for argument 1 from ‘std::istringstream {aka std::basic_istringstream<char>} to ‘const std::istream_iterator<std::basic_string<char> >&
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stream_iterator.h:68:7: note: std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type&) [with _Tp = std::basic_string<char>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int; std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type = std::basic_istream<char>]
istream_iterator(istream_type& __s)
^
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stream_iterator.h:68:7: note: no known conversion for argument 1 from ‘std::istringstream {aka std::basic_istringstream<char>} to ‘std::istream_iterator<std::basic_string<char> >::istream_type& {aka std::basic_istream<char>&}
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stream_iterator.h:64:26: note: constexpr std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator() [with _Tp = std::basic_string<char>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int]
_GLIBCXX_CONSTEXPR istream_iterator()
^
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stream_iterator.h:64:26: note: candidate expects 0 arguments, 1 provided
bin/cliipperex.cpp:187:10: error: no match for ‘operator= (operand types are ‘std::vector<std::basic_string<char> > and ‘<brace-enclosed initializer list>)
tokens = {istream_iterator<string>{istringstream(line)},
^
bin/cliipperex.cpp:187:10: note: candidates are:
In file included from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/vector:69:0,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/random.h:34,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/random:50,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stl_algo.h:65,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/algorithm:62,
from bin/cliipperex.cpp:12:
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/vector.tcc:160:5: note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >]
vector<_Tp, _Alloc>::
^
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/vector.tcc:160:5: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list> to ‘const std::vector<std::basic_string<char> >&
In file included from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/vector:64:0,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/random.h:34,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/random:50,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stl_algo.h:65,
from /home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/algorithm:62,
from bin/cliipperex.cpp:12:
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stl_vector.h:439:7: note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::vector<_Tp, _Alloc>&&) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >]
operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
^
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stl_vector.h:439:7: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list> to ‘std::vector<std::basic_string<char> >&&
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stl_vector.h:461:7: note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::initializer_list<_Tp>) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >]
operator=(initializer_list<value_type> __l)
^
/home/user/anaconda3/envs/deepjetLinux3/include/c++/4.8.3/bits/stl_vector.h:461:7: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list> to ‘std::initializer_list<std::basic_string<char> >
Makefile:13: recipe for target 'exe/cliipperex' failed
make: *** [exe/cliipperex] Error 1

спросил(а) 2017-09-07T11:53:00+03:00 3 года назад
1
Решение
70

Это работает:

 1  #include <iostream>
2 #include <fstream>
3 #include <algorithm>
4 #include <iterator>
5 #include <sstream>
6 #include <vector>
7
8 using namespace std;
9
10 int main()
11 {
12 ifstream geo;
13 string line;
14 geo.open("file.txt", ios::in );
15 vector<string> tokens;
16
17 while(!geo.eof())
18 {
19 getline(geo ,line);
20 istringstream iss(line);
21 copy(istream_iterator<string>(iss),
22 istream_iterator<string>(),
23 back_inserter(tokens)
24 );
25
26 }
27 for (auto i:tokens) {
28 cout << i << ", " ;
29 }
30 cout << endl;
31
32 return 0;
33 }

Этот подход работает также для многострочных файлов и помещает все слова в один и тот же vector.

Линия

tokens = {istream_iterator<string>{istringstream(line)},
istream_iterator<string>{}};

является очень проблематичным и не имеет смысла. Вы пытаетесь инициализировать token, но это уже сделано (строка 15 выше). Либо вы выбираете copy -approach, либо вам нужно повторно инициализировать вектор:

tokens = std::vector<std::string>{istream_iterator<string>(iss), 
istream_iterator<string>()};

Обратите внимание, что вы повторно инициализируете для каждой строки в своем файле второй способ вашего token -vektor. В зависимости от более позднего использования взгляните на copy().

ответил(а) 2017-09-07T12:19:00+03:00 3 года назад
57

Вы используете синтаксис, который компилятор еще не определил.

Использовать новый компилятор

Использовать старый синтаксис:

    tokens = vector<string>( istream_iterator<string>(istringstream( line )),
istream_iterator<string>() );

ответил(а) 2017-09-07T12:19:00+03:00 3 года назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

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