我已经打印出了主要的数组,只是为了测试这个方法是否有效。但是当我尝试在不同的课堂上做同样的事情时,我会遇到错误。
#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);
}
这是我的struct
的标题#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函数,即使我导入了库,而且我能够在我的主要部分执行此操作。这是我的第一个问题,所以我希望我正确格式化。这也是夏天的乐趣。不是作业或任何东西。
答案 0 :(得分: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
,然后避免不正确使用指针的问题。
答案 1 :(得分:0)
phoneBook是指针使用 - &gt;代替 。 ifstream表示“输入文件流”,因此它只能从文件接收输入到您的应用程序
你必须使用“ofstream”或他们的父母“fstream” http://www.cplusplus.com/reference/fstream/fstream/