3

我的日程安排很紧,我对如何让这个程序运行没有任何想法。我对 c++ 和一般编程很陌生,我们刚刚学习类、重载运算符和一堆文件操作,我们必须在程序中使用它们。它很长。该程序基本上是在测试类似于 mp3 播放器(例如 ipod)的功能。这是细分:

1) 我们必须创建两个类:Tsupod 和 Songs,程序中的所有歌曲都将存储在“list.dat”中。

2)我们已经以二进制模式读取列表,写出,在列出所有存储的歌曲时读入,并使用文件操作在文件中找到我们必须在其中找到要删除或要移动的歌曲的点文件...特别是当我必须为洗牌编写函数时。

3)这些都是在五个不同的文件中完成的......显然,reinterpret_cast 的读入和写出在linux系统中不起作用,但它适用于windows。

这是我在公共成员下的歌曲课程中尝试做的事情......

    //overloaded operator '==' ...
     bool operator ==( Songs& b)
    {   
        if (strcmp(Title, b.Title) > 1)
            return false;
        else if (strcmp(Artist, b.Artist) > 1)
            return false;
        else if (size != b.size)
            return false;
        else
            return true;
    }

private:
    char Artist[30];
    char Title[30];
    int size;
};#endif // SONGS_H_INCLUDED

这是我试图实现它的 int tsupod::removeSong(string removeTitle, string emoveArtist) 中的代码 TsuPod.cpp... 字符串 removeTitle 和 remove artist 来自 main 中的函数调用:Pod.removeSong( “等等等等等等”); 其中 Pod 是 tsupod 类的对象。在 removeSong 函数中调用歌曲类,其中艺术家和标题被转换为字符数组。标志在 songFile 中被重置。

for(int i = 0; i < num_songs; i++)
{
    songFile.read(reinterpret_cast<char*>(&info), sizeof(info));
    pos = sizeof(info) * count;
    songfile.seekp(pos - sizeof(info));

    if (S == info)
    {
        num_songs--;    
    }
    else
    {
        songFile.write(reinterpret_cast<char*>(&info), sizeof(info));
        count++
    }
}

我在这个函数中试图做的是覆盖文件中的数据,这样我就不会在文件中有任何我以后必须处理的间隙。我也尝试了很多方法来解决这个问题......重命名旧文件,然后使用旧文件名或保存信息的字符数组创建一个新文件。该程序中的歌曲对象基本上用作巨大的缓冲区来保存信息,然后将这些信息存储到文件中。

我的主要问题是我试图比较同一类的两个对象。“S”和“信息”。在说什么之前,我不允许在这个特定的任务中使用数组,因为根据我的教授练习文件操作,像我这样的学生要花大约 26 个小时在这上面。我也很确定这是我的重载 == 运算符不起作用,因为它总是会跳过每次迭代的条件。这可能是一件非常简单的事情,就像我花了 3 个小时寻找丢失的分号一样。在这种情况下,我怎样才能让这个 ==OPERATOR 工作?

如果有人真的能帮我快速解决这个问题,我会用千日的荣耀认真地赞美你,因为你救了我这个项目没有得到 A+ 的屁股。

4

3 回答 3

5

你使用strcmp不正确。而不是 compare strcmp(char*, char*) > 1,您应该这样做strcmp(char*, char*) != 0(查看两个 C 字符串是否不相等)。请参阅文档:

零值表示两个字符串相等。大于零的值表示第一个不匹配的字符在 str1 中的值大于在 str2 中的值;小于零的值表示相反。

于 2013-04-04T02:28:03.573 回答
2

如果您更改> 1for应该可以工作!= 0

    if (strcmp(Title, b.Title) != 0)
        return false;
    else if (strcmp(Artist, b.Artist) != 0)
        return false;
    return (size == b.size);

我还简化了大小,return size == b.size而不是你的四行来做同样的事情。

于 2013-04-04T02:28:37.553 回答
0

您错过了运算符定义中的const并且错误地检查了strcmp的结果。
此外,最好将相等运算符定义为const,即您声明它,因为它不会更改类数据。
而且,它不是很重要,但用于比较的对象通常命名为rhs(右手边)。

所以,最后,它应该是:

bool operator==(const Songs& rhs) const
{   
    return (strcmp(Title, rhs.Title) == 0) &&
           (strcmp(Title, rhs.Title) == 0) &&    
           (size == rhs.size);
}
private:
    char Artist[30];
    char Title[30];
    int size;
于 2013-04-13T07:11:42.907 回答