Неверное преобразование из void * в char * C ++ при чтении связанного списка из файла

я пытаюсь написать программу, которая читает из текстового файла в связанный список

здесь структура списка.

#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

вот код для чтения:

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 ;

}

это чтение из текстового файла Ranking.dbm который выглядит так:

bagheera
20
bagheera.com
sushi
60
sushi.com
wicket
99
wicket.com
teek
100
teek.com

Однако я получаю сообщение об ошибке: Invalid conversion from void* to char* на всех 3 моих cin.getline() заявления пока он читает из файла. Мне нужно иметь возможность читать построчно из моего файла (Ranking.dbm) и сохраните каждый набор из 3 строк в temp->video_name , temp->ranking а также temp->url а затем создайте новые узлы и сохраните следующие 3 строки … и так далее, до тех пор, пока я не прочту все из файла.

Как я могу это сделать? я делаю это совершенно неправильно или это просто синтаксическая ошибка? я все еще изучаю C ++: /

4

Решение

Это неправильное использование std::istream::getline():

cin.getline(rankFile, temp->video_name, "\n");

и не имеет никакого смысла, так как задействованы два входных потока: cin а также rankFile, Правильный вызов (но не самый предпочтительный):

rankFile.getline(temp->video_name, 1023);

Предложить:

  • с помощью std::string вместо char[] и использовать std::getline(in, std::string&).
  • использование operator>> читать int как вы не можете использовать std::getline() за это.
  • проверить результат каждый операция чтения.
  • не использовать malloc() в C ++ используют new а также delete,
  • не выделяйте динамически, если не нужно.
  • использовать один из контейнеров STL для хранения списка, а не реализовывать его самостоятельно, 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;
}
5

Другие решения

getline(rankFile, temp->video_name); // You should write it this way
0

По вопросам рекламы [email protected]