2

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

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

4

2 回答 2

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
于 2012-12-13T12:28:40.373 回答
2

如果您从 IDE 运行程序,则可能是 IDE 的当前目录针对的是 exe 目录以外的其他位置。尝试从命令行运行 EXE。还可以尝试提供文件的完整路径,以确保它可以找到它。

一点点主题,虽然 C++ 允许运算符重载,但我不鼓励这样做,原因很简单——这使得在代码中搜索运算符重载的声明变得困难!(尝试搜索operator >>特定类型...)。具有功能的编辑器go to declaration也不能很好地处理这个问题。最好是让它成为一个正常的功能,

std::string AlbumsToString (AlbumCollection &ac)

它返回一个string你可以连接到你的流的:

mystream << blah << " " << blah << " " << AlbumsToString(myAlbums) << more_blah << endl;  // !!!

您可以使用ostringstreaminsideAlbumToString来构建类似流的字符串,并最终返回str()成员 if ostringstream

于 2012-12-13T12:28:23.770 回答