Я пытаюсь создать спам-фильтр. Мне нужно сначала обучить модель. Я прочитал слова из текстового файла, который имеет слово «спам» или «ветчина» в качестве первого слова абзаца, а затем слова в почте и количество его вхождений сразу после слова. В файле есть параграфы. Моя программа способна прочитать первый абзац, который является словами и их количеством вхождений.Файл перестает читаться после символа новой строки
Проблема заключается в том, что файл перестает читать после столкновения с новой строкой и не читает следующий абзац. Хотя у меня такое чувство, что способ проверки символа новой строки, который является концом абзаца, не совсем корректен.
Я дал два параграфа, чтобы вы поняли текст поезда. Поезд текстового файла.
/000/003 ветчина потребность 1 ФВ 1 35 2 39 1 благодарит 1 нить 2 40 1 копия 1 еще 1 коррелятор 1 под 1 компании 1 25 1 он 2 26 2 168 1 29 2 Содержание 4 1 1 6 1 5 1 4 1 обзор 2 мы 1 john 3 17 1 использование 1 15 1 20 1 классы 1 май 1 a 1 назад 1 l 1 01 1 произведено 1 i 1 да 1 10 2 713 2 v6 1 p 1 оригинал 2
/000/031 ветчины дон 1 ким 5 Дэйв 1 39 1 клиент 1 38 2 благодарит 1 за 1 поток 2 года 1 коррелятор 1 до 1 Вильямс 1 пн 2 номер 2 кухня 1 168 1 29 1 содержание-3 2 2 6 система 2 1 2 7 1 6 1 5 2 4 1 9 1 каждый 1 8 1 вид 2
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
int V = 0; // Total number of words
ifstream fin;
fin.open("train", ios::in);
string word;
int wordnum;
int N[2] = {0};
char c, skip;
for (int i = 0; i < 8; i++) fin >> skip; // There are 8 characters before the first word of the paragraph
while (!fin.fail())
{
fin >> word;
if (word == "spam") N[0]++;
else if (word == "ham") N[1]++;
else
{
V++;
fin >> wordnum;
}
int p = fin.tellg();
fin >> c; //To check for newline. If its there, we skip the first eight characters of the new paragraph because those characters aren't supposed to be read
if (c == '\n')
{
for (int i = 0; i < 8; i++) fin >> skip;
}
else fin.seekg(p);
}
cout << "\nSpam: " << N[0];
cout << "\nHam :" << N[1];
cout << "\nVocab: " << V;
fin.close();
return 0;
}
'while (! Fin.fail()) {/ * ... * /}' может быть не намного лучше, чем указано в [здесь] (здесь) http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong). Хотя здесь [какой-то стартер] (http://stackoverflow.com/questions/24504582/how-to-test-whether-stringstream-operator-has-parsed-a-bad-type-and-skip-it), доспехи вы с некоторыми методами, которые могут быть полезны для решения вашей проблемы. –
Не могли бы вы предоставить образец файла «train» (путем редактирования вашего вопроса)? –
Gosh _who_ учит всех всех этих неправильных способов использования потоков ?! –