重载>>运算符读入文本文件

时间:2012-12-13 12:16:52

标签: c++ io overloading

使用此代码重载>>阅读文本文件:

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 ++读取文本文件;我真的不明白为什么这不起作用,我能找到的在线帮助似乎并没有表明我做错了什么......

2 个答案:

答案 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()成员{。}}。