2014-09-25 2 views
2

Я пытаюсь создать спам-фильтр. Мне нужно сначала обучить модель. Я прочитал слова из текстового файла, который имеет слово «спам» или «ветчина» в качестве первого слова абзаца, а затем слова в почте и количество его вхождений сразу после слова. В файле есть параграфы. Моя программа способна прочитать первый абзац, который является словами и их количеством вхождений.Файл перестает читаться после символа новой строки

Проблема заключается в том, что файл перестает читать после столкновения с новой строкой и не читает следующий абзац. Хотя у меня такое чувство, что способ проверки символа новой строки, который является концом абзаца, не совсем корректен.

Я дал два параграфа, чтобы вы поняли текст поезда. Поезд текстового файла.

/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; 
} 
+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), доспехи вы с некоторыми методами, которые могут быть полезны для решения вашей проблемы. –

+1

Не могли бы вы предоставить образец файла «train» (путем редактирования вашего вопроса)? –

+2

Gosh _who_ учит всех всех этих неправильных способов использования потоков ?! –

ответ

1

std::ifstream::operator>>() не читает \n в переменной; он падает. Если вам нужно манипулировать пробелами и символами \n, вы можете использовать std::ifstream::get()

+0

Ваш английский хорошо. Спасибо за ответ. –

+0

также вы можете прочитать всю строку (через std :: getline()) в std :: string и после разделить ее словами. – Kastaneda

Смежные вопросы