使用此代码重载>>阅读文本文件:
std::istream& operator>> (std::istream &in, AlbumCollection &ac)
{
std::ifstream inf("albums.txt");
// If we couldn't open the input file stream for reading
if (!inf)
{
// Print an error and exit
std::cerr << "Uh oh, file could not be opened for reading!" << std::endl;
exit(1);
}
// While there's still stuff left to read
while (inf)
{
std::string strInput;
getline(inf, strInput);
in >> strInput;
}
被叫:
AlbumCollection al = AlbumCollection(albums);
cin >> al;
该文件位于源目录中,与.exe位于同一目录中,但始终表示文件无法正常处理。很抱歉,如果答案非常明显,这是我第一次尝试用C ++读取文本文件;我真的不明白为什么这不起作用,我能找到的在线帮助似乎并没有表明我做错了什么......
答案 0 :(得分:5)
您必须检查工作目录。通过其相对路径指定文件时,相对路径始终被视为相对于工作目录。例如,您可以使用函数getcwd()
打印工作目录。
您可以从IDE的项目属性更改设置中的工作目录。
一些评论:
inf
的内容覆盖in
的内容。cin
通常不适用于文件。事实上,您的运营商的更好版本将是:
std::istream& operator>>(std::istream& in, AlbumCollection& ac)
{
std::string str;
while(in >> str)
{
// Process the string, for example add it to the collection of albums
}
return in;
}
如何使用它:
AlbumCollection myAlbum = ...;
std::ifstream file("albums.txt");
file >> myAlbum;
但对于序列化/反序列化,我认为最好使用AlbumCollection
中的函数:
class AlbumCollection
{
public:
// ...
bool load();
bool save() const;
};
此方法允许您的代码更具自我描述性:
if(myAlbum.load("albums.txt"))
// do stuff
答案 1 :(得分:2)
如果从IDE运行程序,IDE的当前目录可能是针对exe目录以外的其他位置。尝试从命令行运行EXE。尝试也提供文件的完整路径,以确保它可以找到它。
虽然C ++允许运算符重载,但我不鼓励这样做,因为非常简单的原因 - 这使得很难在代码中搜索运算符重载的声明! (尝试搜索特定类型的operator >>
...)。具有go to declaration
功能的编辑器也不能很好地处理这个问题。最好是让它成为正常的功能,
std::string AlbumsToString (AlbumCollection &ac)
返回string
,您可以将其连接到您的流:
mystream << blah << " " << blah << " " << AlbumsToString(myAlbums) << more_blah << endl; // !!!
您可以使用ostringstream
内的AlbumToString
来构建类似字符串的流,并最终返回str()
成员{。}}。