Как прочитать файл и получить слова в C ++ - PullRequest
1 голос
/ 12 сентября 2010

Мне любопытно, как пословно читать входные данные из текстового файла без заданной структуры (например, заметки или небольшой отчет).Например, текст может быть структурирован так:

"06/05/2002
Сегодня хороший день;
Червь повернулся и битва выиграна."

Я подумал, может быть, получить строку с помощью getline, а затем посмотреть, смогу ли я оттуда разделить ее на слова через пробелы.Тогда я подумал, что использование strtok может сработать!Однако я не думаю, что это сработает с пунктуацией.

Еще один метод, о котором я думал, это получить все символы за символом и исключить символы, которые не нужны.Тем не менее, это кажется маловероятным.

Итак, для краткости: есть ли простой способ прочитать входные данные из файла и разделить их на слова?

Ответы [ 4 ]

3 голосов
/ 12 сентября 2010

Так как написать проще, чем найти повторяющийся вопрос,

#include <iterator>

std::istream_iterator<std::string> word_iter( my_file_stream ), word_iter_end;

size_t wordcnt;
for ( ; word_iter != word_iter_end; ++ word_iter ) {
    std::cout << "word " << wordcnt << ": " << * word_iter << '\n';
}

Аргумент std::string для istream_iterator говорит ему возвращать string, когда вы делаете *word_iter.Каждый раз, когда итератор увеличивается, он захватывает другое слово из своего потока.

Если у вас есть несколько итераторов в одном и том же потоке одновременно, вы можете выбрать один из типов данных для извлечения.Однако в этом случае может быть проще просто использовать >> напрямую.Преимущество итератора в том, что он может подключаться к универсальным функциям в <algorithm>.

3 голосов
/ 12 сентября 2010

Да.Вы ищете std::istream::operator>> :) Обратите внимание, что это удалит последовательные пробелы, но я сомневаюсь, что здесь проблема.

т.е.

std::ifstream file("filename");
std::vector<std::string> words;
std::string currentWord;
while(file >> currentWord)
    words.push_back(currentWord);
0 голосов
/ 12 сентября 2010

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

Если вы позже намереваетесь интерпретировать слова, я бы порекомендовал этот подход.

Я могугорячо рекомендую книгу «Написание компиляторов и интерпретаторов» Рональда Мак (Wiley Computer Publishing)

0 голосов
/ 12 сентября 2010

Вы можете использовать getline с пробелом, getline(buffer,1000,' ');

Или, возможно, вы можете использовать эту функцию для разделения строки на несколько частей с определенным разделителем:

string StrPart(string s, char sep, int i) {
  string out="";
  int n=0, c=0;
  for (c=0;c<(int)s.length();c++) {
    if (s[c]==sep) {
      n+=1;
    } else {
      if (n==i) out+=s[c];
    }
  }
  return out;
}

Примечания: эта функция предполагает, что вы объявили using namespace std;.

s - строка для разделения. sep является разделителем i часть, которую нужно получить (на основе 0).

...