acc*_*aze 4 c++ linked-list getline
我试图编写一个从文本文件读取到链接列表的程序
这是列表结构.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct Video {
char video_name[1024]; // video name
int ranking; // Number of viewer hits
char url[1024]; // URL
Video *next; // pointer to Video structure
} *head = NULL; // EMPTY linked list
Run Code Online (Sandbox Code Playgroud)
这是读入代码:
void load()
{
struct Video *temp;
temp = (Video*)malloc(sizeof(Video)); //allocate space for node
temp = head;
ifstream rankFile ("Ranking.dbm");
if (rankFile.is_open())
{
while ( rankFile.good() )
{
cin.getline(rankFile, temp->video_name, "\n");
cin.getline(rankFile, temp->ranking, "\n");
cin.getline(rankFile, temp->url, "\n");
temp = temp->next;
}
myfile.close();
}
else cout << "Unable to open file";
return ;
}
Run Code Online (Sandbox Code Playgroud)
它正在从一个文本文件中读取,Ranking.dbm如下所示:
bagheera
20
bagheera.com
sushi
60
sushi.com
wicket
99
wicket.com
teek
100
teek.com
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误说:Invalid conversion from void* to char*在我cin.getline()从文件中读取的所有3个语句中.我需要能够通过从我的文件逐行阅读(Ranking.dbm)和存储每一组的3线temp->video_name,temp->ranking并temp->url再创建一个新的节点,并救下了3行......等等等等,直到香港专业教育学院在读文件中的所有内容.
我怎样才能做到这一点?我是以完全错误的方式解决这个问题还是仅仅是语法错误?我仍然掌握着C++:/
这是错误的使用std::istream::getline():
cin.getline(rankFile, temp->video_name, "\n");
Run Code Online (Sandbox Code Playgroud)
并且没有任何意义,因为涉及两个输入流:cin和rankFile.正确的调用(但不是最优选的)是:
rankFile.getline(temp->video_name, 1023);
Run Code Online (Sandbox Code Playgroud)
建议:
std::string而不是char[]和使用std::getline(in, std::string&).operator>>读int,你不能用std::getline()这个.malloc()在C++中使用new和delete.std::vector<Video>.例如:
struct Video {
std::string video_name;
int ranking;
std::string url;
};
std::vector<Video> load()
{
std::vector<Video> result;
std::ifstream rankFile("Ranking.dbm");
if (rankFile.is_open())
{
Video temp;
std::string line;
while (std::getline(rankFile, temp.video_name) &&
rankFile >> temp.ranking &&
std::getline(rankFile, line) && // need to skip 'ranking's
// unread new-line
std::getline(rankFile, temp.url))
{
result.push_back(temp);
}
}
else
{
std::cerr << "Unable to open file";
}
return result;
}
Run Code Online (Sandbox Code Playgroud)