2017-02-21 2 views
1
using namespace std; 

struct WebSites 
{ 
    string siteName; 
    int rank; 

    string getSiteName() { return siteName; } 
    int getRank() { return rank; } 
    WebSites(string const&, int); 
    WebSites(); 
}; 

WebSites::WebSites(string const& siteName, int rank) { 
    this->siteName = siteName; 
    this->rank = rank; 

} 

WebSites::WebSites() {} 

ostream& operator << (ostream& stream, WebSites const& data) { 
    stream << data.rank << " " << data.siteName.size() << " " << data.siteName<< endl; 
    return stream; 

} 

istream& operator >> (istream& stream, WebSites data) { 
    stream >> data.siteName >> data.rank; 
    return stream; 

} 


int main() { 

    WebSites s1("www.google.co.uk", 1); 

    //write to file 

    ofstream writer("chou.dat", ios::out | ios::binary); //i'll add ios::app later 
    if (!writer) { 
     cout << " error opening file " << endl; 
     return -1; 
    } 
    else { 
     writer << s1.getSiteName() << " " << s1.getRank() << endl; 
    } 
    writer.close(); 

    //read file 
    fstream writerR("chou.dat", ios::binary | ios::in | ios::ate); 
    WebSites read; 
    while (writerR >> read) { 

     cout << read.siteName << " rank: "<< read.rank << endl; 
    } 
    writerR.close(); 
    return 0; 
} 

Может кто-нибудь сказать мне, почему эта программа не будет читать и отображать консоль файла ??? Я имею в виду, что он пишет отлично. Я попытался изменить материал, но ничего не работал. Я проверил аналогичный код в Интернете и все еще ничего.C++ File I/O Я не могу прочитать файл .dat

+0

'fstream writerR' <- если это для чтения, почему не' ifstream'? –

+0

Зачем вы называете поток чтения 'writeR'? Почему бы не назвать его «читателем»? Также всегда проверяйте, открыт ли файл до того, как вы попытаетесь его прочитать. – NathanOliver

+0

Не уверен, что это проблема, но вы передаете ios :: ate в open, что заставляет файл искать до конца. С конца файла ничего не читать. Также я бы предположил, что лучше использовать поток входных файлов (ifstream), и вы не можете прочитать целую структуру, как вы пытаетесь сделать, если вы пишете каждое поле отдельно. Вы указываете двоичный режим, но вы действуете так, как будто вы сбрасываете текст. Как я вижу, у этого кода не одна, а пара проблем. –

ответ

0

Есть некоторые вопросы:

  1. Accouding к docs задающим ios::ate бы

    стремится к концу потока сразу же после открытого

    Так что просто нечего читать и ваш цикл while никогда не будет введен.

  2. Другой вопрос здесь: operator >> (istream& stream, WebSites data)

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

    operator >> (istream& stream, WebSites& data)

+0

Я понимаю, что я сделал второй параметр ссылкой, но он по-прежнему не работает. – choudhry

+0

Я понял, что вы говорили, и сделал поправку по какой-то причине. Он все еще не работает ... – choudhry

+0

Да, сейчас это работает. сделайте свои исправления, правильно ...... – choudhry