Songs *ptr;
ptr = new Songs[25];
ifstream fin;
fin.open("input.txt");
while (fin.good()) //my input
{
getline(fin, song[num].title);
getline(fin, song[num].artist);
fin >> song[num].mem;
num++;
fin>>ws;
}
fin.close();
并且我的功能是我试图使用randomshuffle
void shuffle (char choice, Songs song[], Songs *ptr, string title, string artist, int mem, int num)
{
if (choice == '4')
{
std::random_shuffle(ptr, ptr + num); //shuffle
}
for (int i = 0; i<num; i++) //test
{
cout << ptr[i].title << ptr[i].artist << ptr[i].mem << endl;
}
}
答案 0 :(得分:3)
绝不要将istream::good()
或istream::eof()
用作循环条件。它几乎总是产生错误代码(就像在这种情况下一样。)
尝试:
while (std::getline(fin, song[num].title) &&
std::getline(fin, song[num].artist) &&
fin >> song[num].mem)
{
num++;
fin>>ws;
}
正如臭的指出,你的洗牌是正确的,虽然风格很糟糕。尝试:
void shuffle (char choice, Songs *ptr, int num)
{
if (choice == '4')
{
std::random_shuffle(ptr, ptr + num); //shuffle
}
for (int i = 0; i<num; i++) //test
{
std::cout << ptr[i].title << ptr[i].artist << ptr[i].mem << "\n";
}
}
答案 1 :(得分:2)
请考虑以下内容,这是一种更现代的C ++方法来解决您的问题。您可以创建流操作符,这样您就不必在每次希望读入时手动解析对象。
#include <algorithm>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
struct song {
std::string title, artist;
int mem;
};
std::ostream& operator<<(std::ostream& os, const song& s) {
return os << s.title << "\t" << s.artist << "\t" << s.mem;
}
std::istream& operator>>(std::istream& is, song& s) {
std::getline(is, s.title);
std::getline(is, s.artist);
return is >> s.mem;
}
int main()
{
std::ifstream file("input.txt");
if(!file.is_open()) return 1;
std::vector<song> songs((std::istream_iterator<song>(file)),
std::istream_iterator<song>());
std::random_shuffle(songs.begin(), songs.end());
std::copy(songs.begin(), songs.end(),
std::ostream_iterator<song>(std::cout, "\n"));
return 0;
}
编译但未使用您的文件格式
没有载体(但请学习它):
std::vector<song> songs((std::istream_iterator<song>(file)),
std::istream_iterator<song>());
可以写成:
const size_t sz=20;
song songs[sz];
for(unsigned i=0; i!=sz && file; ++i)
file >> songs[i];
并且函数调用的其余部分将像
一样工作std::random_shuffle(songs, songs+sz);
但现在认真学习矢量(然后是其他容器)。对于你的任务,数组基本上被认为是不赞成的,例如,如果你在文件中有超过20个元素,你会得到一个缓冲区溢出并且会发生坏事。
http://en.cppreference.com/w/cpp/container/vector
由于RAII,您也不需要显式打开和关闭文件(在大多数情况下,您更有可能引入错误):
http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization