функция getline, читающая случайные символы не в файле; два случайных символа читаются вместе с данными в notepad keyword.txt - PullRequest
1 голос
/ 30 октября 2010
#include "keywords.h"
#include <iostream>
#include <fstream>
#include "llist.h"
#include <string>
using namespace std;
//default constructor
List<string> L;
keywords::keywords(){

}
void keywords::open_file(string filename)
{
    input.open(filename.c_str());
}
void keywords::close_file(){
    input.close();
}
void keywords::load()
{
    string t;
    while(input)
    {
        getline(input,t);//error line
        L.insert_ordered(t);
        L++;
    }
    L.print(cout);
}
bool keywords::find(std::string token)
{
    L.start();
    if(L.find(token)==1)
        return 1;
    else return 0;
}

Ответы [ 4 ]

1 голос
/ 30 октября 2010

Вы не проверяете, действительно ли getline() действительно прочитал строку.Ваш цикл должен проверить возвращаемое значение getline():

while(getline(input,t)) {
    L.insert_ordered(t);
    L++;
}
0 голосов
/ 31 октября 2010
void keywords::load()
{    
    string t;    
    while(input)    
    {        
        getline(input,t);//error line        
        L.insert_ordered(t);        
        L++;    
    }    
    L.print(cout);
}

Вот ключевая строка:

while(input) 

Это действительно означает:

while(!input.fail()) 

Посмотрите документацию ifstream :: fail () в http://www.cppreference.com/wiki/io/eof. Объясняется, как работают ifstream :: fail () (и eof ()).В вашем случае input.fail () следует проверять сразу после попытки чтения из файла, но перед попыткой использовать значение read.

Другими словами, вы должны проверить сразу после getline (..), но перед L.insert_ordered (...)

Попробуйте это -

void keywords::load()
{    
    string t;    
    while(true)    
    {        
        getline(input,t);
        if (!input)
            break;         
        L.insert_ordered(t);        
        L++;    
    }    
    L.print(cout);
}

Вотдругим способом вы можете сделать это:

void keywords::load()
{    
    string t;  

    getline(input,t);  
    while(input)    
    {               
        L.insert_ordered(t);        
        L++;    

        getline(input,t);

    }    
    L.print(cout);
}

Я не пытался скомпилировать и запустить их, так что вы можете решить это самостоятельно, но я надеюсь, что вы поймете общую идею.Я не уверен, работает ли остальная часть вашей программы нормально или нет (я немного не уверен насчет цели L ++ в вашем коде), но я надеюсь, что объяснение о том, как использовать ifstream :: fail () (или неявный вызовэто путем тестирования потока напрямую) помогает.

0 голосов
/ 30 октября 2010

возможно, это файл Unicode, и вы видите байты флага порядка байтов в начале файла

0 голосов
/ 30 октября 2010

Странное поведение. Это на самом деле компилируется? Не могли бы вы проиллюстрировать некоторые результаты? Я спрашиваю, потому что, насколько мне известно, getline на самом деле определяется следующим образом: istream& getline (char* s, streamsize n );.

...