Можете ли вы предотвратить глотание новой строки в istream или stringstream? - PullRequest
1 голос
/ 20 января 2011

Для моего проекта домашней работы мне пришлось читать книгу, а затем анализировать ее слово в слово, перечисляя вхождения каждого слова и соответствующую строку, в которой оно было найдено.Сейчас я закончу с проектом и собираюсь оптимизировать мой код, читая использование STL другими людьми (мы должны полагаться на STL для этого задания).

Это не касается самой домашней работы, но две попытки, которые я сделал для чтения в каждом слове, привели к тому, что поток съел мои новые строки.Без них я не мог бы отследить, на какой строке я нахожусь в документе, который я читаю, поэтому исключил использование таких решений.

Попытка первая:

string word;
stringstream ss;
ss << document; // Document was read from file and stored in a "string document"
while(ss)
{
    ss >> word;
    // Work with the word.
    // Oops! No newlines anymore! :(
}

Попытка вторая:

ifstream ifs(filename.c_str());
if(ifs.is_open)
{
    typedef istream_iterator<string> string_input;
    vector<string> words;
    copy(string_input(ifs), strin_input(), back_inserter(words));

    // Oops! The newlines are gone here too! :(
}

Мое текущее решение не так красиво, как хотелось бы, и я хочу, чтобы в нем было больше магии STL (просто для того, чтобы изучить некоторые хитрые трюки STL и получить дажеудобнее с ним)

Текущее решение:

Читать файл:

std::ostringstream os;
ss << ifstream(filename.c_str()).rdbuf();
return ss.str();

И разбить на строку и слово:

size_t oldNewLine = 0;
size_t newLine = document_.find('\n', oldNewLine);
while(newLine != string::npos)
{
    string documentLine = document_.substr(oldNewLine, (newLine - oldNewLine));
    vector<string> words = Utility::split(documentLine);

   // Work with each individual word
   // Yay! I can keep track of the line number now! :)

   oldNewLine = newLine + 1; // Curse you, off by one error!
   newLine = document_.find('\n', oldNewLine);
}

чтение файла является коротким, кратким и очень читабельным imo, но разбиение каждой строки и слова утомительно.Хотел бы я сразу же прочитать каждое слово из файла, сохранив перевод строки.Там должен быть короткий, сладкий способ сделать это!

Итак, как это сделать?

1 Ответ

3 голосов
/ 20 января 2011

Вы можете разбирать слова построчно:

std::string line;
vector<string> words;

while(std::getline(ifs, line))
{
    std::stringstream linestream(line);

    copy(std::istream_iterator<std::string>(linestream),
         std::istream_iterator<std::string>(),
         std::back_inserter(words));

    ++lineCount;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...