2013-06-15 2 views
-1

Я распечатал массив в основном, чтобы проверить, работает ли этот метод, и он это делает. Но когда я пытаюсь сделать то же самое в другом классе, я получаю ошибки.Почему возникает ошибка: eof не является типом класса fstream?

#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include <fstream> 
#include "struct.h" 
#include "phoneBook.h" 

using namespace std; 

int main() 
{ 
    struct contacts info[256]; 
    phoneTools manipulate; 
    fstream phoneBook ("phoneBook.txt"); 

    if(!phoneBook.is_open()) 
    { 
     cout<< "The file can not be opened"; 
     cout<< endl; 
     cout<< "Terminating!"; 

     exit(1); 
    } 

    else 
    { 
     //populate array of structs 
     int i = 0; 
     while(!phoneBook.eof()) 
     { 
      phoneBook>> info[i].firstName; 
      phoneBook>> info[i].surName; 
      phoneBook>> info[i].phoneNumber; 
      phoneBook>> info[i].email; 
      phoneBook>> info[i].relationship; 
      i++; 
     } 
    } 

    manipulate.addContact(info, phoneBook); 
} 

Это другой класс, где я получаю ошибки. Я поставлю заголовки внизу вместе с сообщениями об ошибках. Я также понимаю, что у меня могут быть импортированы некоторые библиотеки, которые я не использую, но я это сделаю. Я просто не закончил создание всех функций.

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include <fstream> 
#include "struct.h" 

using namespace std; 

void writeStructToDatabase(struct contacts writeContact[], fstream *phoneBook) 
{ 
    //We are passed new array of contacts 
    //write this new array to the phonebook file 
    int i = 0; 
    while(!phoneBook->eof()) 
    { 
     phoneBook<< writeContact[i].firstName; 
     phoneBook<< writeContact[i].surName; 
     phoneBook<< writeContact[i].phoneNumber; 
     phoneBook<< writeContact[i].email; 
     phoneBook<< writeContact[i].relationship; 
     i++; 
    } 
} 

void showPhoneBook(struct contacts print[]) 
{ 
    int num = (sizeof(print)/sizeof(*print)); 

    cout<< endl; 
    cout<< endl; 
    for(int i = 0; i < num; i++) 
    { 
     cout<< print[i].firstName; 
     cout<< endl; 

     cout<< print[i].surName; 
     cout<< endl; 

     cout<< print[i].phoneNumber; 
     cout<< endl; 

     cout<< print[i].email; 
     cout<< endl; 

     cout<< print[i].relationship; 
     cout<< endl; 
    } 
    cout<< endl; 
} 

void addContact(struct contacts newContact[], fstream *phoneBook) 
{ 
    int num = (sizeof(newContact)/sizeof(*newContact)); 

    cout<< "First Name: "; 
    cin>> newContact[num].firstName; 
    cout<< endl; 

    cout<< "Last Name: "; 
    cin>> newContact[num].surName; 
    cout<< endl; 

    cout<< "Phone Number: "; 
    cin>> newContact[num].phoneNumber; 
    cout<< endl; 

    cout<< "Email: "; 
    cin>> newContact[num].email; 
    cout<< endl; 

    cout<< "Relationship: "; 
    cin>> newContact[num].relationship; 
    cout<< endl; 

    writeStructToDatabase(newContact, phoneBook); 
} 

void deleteContact(struct contacts delContact[], fstream *phoneBook) 
{ 
    string first; 
    string last; 

    cout<< "First Name: "; 
    cin>> first; 
    cout<< endl; 

    cout<< "Last Name: "; 
    cin>> last; 
    cout<< endl; 

    int num = (sizeof(delContact)/sizeof(*delContact)); 

    int exit = 0; 
    int i = 0; 
    while(exit == 0) 
    { 
     if((strcmp(delContact[i].firstName, first) == 0) && 
      (strcmp(delContact[i].surName, last) == 0)) 
     { 
      for(int j = i; j < num; j++) 
      { 
       delContact[j] = delContact[j+1]; 
      } 

      exit = 1; 
     } 

     i++; 
    } 

writeStructToDatabase(delContact, phoneBook); 
} 

Вот мой заголовок для моей структуры

#include <string.h> 

using namespace std; 

#ifndef STRUCT_H 
#define STRUCT_H 
struct contacts 
{ 
    string firstName; 
    string surName; 
    string phoneNumber; 
    string email; 
    string relationship; 
}; 
#endif 

Вот заголовок для моей функции класса

#include <fstream> 

using namespace std; 

#ifndef PHONE_BOOK_H 
#define PHONE_BOOK_H 

//enter methods below this line 
//ex. extern void getRandInteger(int max); 

class phoneTools 
{ 
    public: 
    void addContact(contacts newContact[], fstream *phoneBook); 
    void showPhoneBook(contacts print[]); 
    void deleteContact(contacts delContact[], fstream *phoneBook); 

    private: 
    void writeStructToDatabase(contacts writeContact[], fstream *phoneBook); 
}; 

//enter methods above this line 

#endif /* __PHONE_BOOK_H */ 

Теперь вот ошибки я получаю

phoneBook.cpp: In function ‘void writeStructToDatabase(contacts*, std::fstream*)’: 
phoneBook.cpp:16: error: no match for ‘operator<<’ in ‘phoneBook << writeContact[i].contacts::firstName’ 
phoneBook.cpp:17: error: no match for ‘operator<<’ in ‘phoneBook << writeContact[i].contacts::surName’ 
phoneBook.cpp:18: error: no match for ‘operator<<’ in ‘phoneBook << writeContact[i].contacts::phoneNumber’ 
phoneBook.cpp:19: error: no match for ‘operator<<’ in ‘phoneBook << writeContact[i].contacts::email’ 
phoneBook.cpp:20: error: no match for ‘operator<<’ in ‘phoneBook << writeContact[i].contacts::relationship’ 
phoneBook.cpp: In function ‘void deleteContact(contacts*, std::fstream*)’: 
phoneBook.cpp:97: error: cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’ 
phoneBook.cpp:98: error: cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’ 
phoneBookDriver.cpp: In function ‘int main()’: 
phoneBookDriver.cpp:40: error: invalid conversion from ‘void*’ to ‘std::fstream*’ 
phoneBookDriver.cpp:40: error: initializing argument 2 of ‘void phoneTools::addContact(contacts*, std::fstream*)’ 
i686-apple-darwin11-llvm-g++-4.2: phoneBook.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: phoneBookDriver.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: no input files 

Я искал последний день пытаясь понять, почему я не могу использовать функции fstream, хотя я импортировал библиотеку, и я в состоянии сделать это в своей основной. Это мой первый вопрос здесь, поэтому я надеюсь, что правильно отформатировал его. Также это весело для лета. Не домашнее задание или что-то еще.

+1

Потому что 'phoneBook' является указателем. Попробуйте '->' вместо '.'. –

+0

ohh okay. Спасибо. Не правда ли, что я не передаю файл phoneBook правильно, и поэтому я не могу написать ему из phoneBook.cpp? –

+1

['while (! Eof())' is wrong.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) Кроме того, '__STRUCT_H 'и' __PHONE_BOOK_H' являются [зарезервированными идентификаторами] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier). – chris

ответ

2

Ваша вторая версия код нет делать то же самое, как вы требуете. Используется переменная типа ifstream*, а не переменная типа ifstream, и вы используете <<, чтобы читать от нее не >>. Если бы вы сделали то же самое, это сработало бы, но вы изменили его, чтобы сделать что-то другое и сломано.

ошибка делает не сказать eof не тип класса fstream, прочитать ее еще раз более тщательно:

phoneBook.cpp:14: error: request for member ‘eof’ in ‘phoneBook’, 
    which is of non-class type ‘std::ifstream*’ 

он говорит phoneBook имеет неклассовую типа ifstream* (т.е. типа указатель) и что вы пытаетесь использовать его члена, что довольно понятно, потому что указатели не имеют членов.

Правильно прочитайте ошибку, и она сообщит вам, что случилось. Прочтите свой код более тщательно, и вы сами убедитесь, что вторая версия не эквивалентна первой.

Кроме того, как comment from chris говорит, сделать не это сделать:

#ifndef __PHONE_BOOK_H 

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

И не это сделать:

while(!phoneBook.eof()) 

петля выйдет после не в состоянии прочитать данные, которые не то, что вы хотите, это вы хотите:

while(*phoneBook >> writeContact[i].firstName >> writeContact[i].surName 
     >> writeContact[i].phoneNumber>> writeContact[i].email 
     >> writeContact[i].relationship) 

(Примечание с использованием >> не <<)

Но почему бы не мак е было легче читать и определить operator>>(std::istream&, contacts&), которые позволили бы вам сделать просто:

while (*phoneBook >> writeContact[i]) 

И вы также можете пройти по ссылке ifstream не указатель, то во избежание проблем не с помощью указателя правильно.

+0

** Обновление ** Я только что изменил код и ошибки вверх, чтобы соответствовать тем, что у меня есть после внесения этих изменений. Еще раз спасибо за помощь –

+0

JONATHAN WAKELY благодарим вас за подробный ответ и лучший способ заполнения моей телефонной книги. Я начну реализовывать это сейчас. –

0

phoneBook - использование указателя -> вместо. и ifstream означает «поток входного файла», чтобы он мог получить вход только из файла в приложении

вы должны использовать «ofstream» или родителю из них «fstream» http://www.cplusplus.com/reference/fstream/fstream/

+0

Крис Я прочитал stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier. После того, как я прочитал, я удалил двойные подчеркивания в файлах заголовков. Итак, теперь у меня PHONE_BOOK_H. Оли я изменил свое время, пока (! PhoneBook-> eof()), и это исправило ошибку. Мохамед I изменил свое заявление на телефонную книгу с «ifstream» на «fstream», потому что мне нужны операции ввода и вывода. Тем не менее, я все еще получаю эти ошибки. Я также поменял его в заголовках и других файлах. Спасибо за помощь –

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