如果遇到麻烦

时间:2014-05-02 19:43:24

标签: c++ ifstream

我有以下代码。它编译得很好,但它告诉我字符串是“E# ^ $ $ @ $$$$$$$”。 有什么想法吗?

ifstream InFile(Filename);
if (!InFile)
    return false;
std::string Name;
Song *pSong;

for (int a = 0; a < Playlist.size(); a++)
{
    delete Playlist[a];
}
Playlist.clear();

while (true)
{
    if (!InFile)
        break;

    pSong = new Song();

    std::getline(InFile, Name, '\n');
    pSong->File = const_cast<char*>(Name.c_str());
    std::getline(InFile, Name, '\n');
    pSong->Volume = atof(Name.c_str());

    Playlist.push_back(pSong);
}

播放列表:std::vector<Song*>Playlist;

1 个答案:

答案 0 :(得分:3)

这是有问题的一行。

pSong->File = const_cast<char*>(Name.c_str());

您正在存储指向内存的指针,该指针在您从文件中读取下一行文本后无效。

将其更改为:

pSong->File = strdup(Name.c_str());

如果您的平台没有strdup,这是一个简单的实现。

char* strdup(char const* s)
{
   char* ret = malloc(strlen(s)+1);
   strcpy(ret, s);
   return ret;
}

<强>注意 由于在使用strdup时分配内存,因此必须确保取消分配内存。

您可以选择使用new来分配内存,因为您使用的是C ++。如果使用new分配内存,则必须使用delete来释放内存。如果使用malloc分配内存,如本答案中所示,则必须使用free来释放内存。