2009-08-05 3 views
2

Я задал этот вопрос ранее here и аналогичный вопрос был закрыт.прочитайте из файла в массив структур внутри структур в C++

SO на основе комментария от другого пользователя, я стану ассоциироваться моим вопросом:

В первом посте я пытался читать тх данные из файла в массив с помощью struct.By < < входных данных, p [i] и является >> p.fId, я смог прочитать значения из файла данных в PersonId.

Теперь я хочу попробовать это:

struct PersonId 
{ 
    int fId; 
}; 

struct PersonData 
{ 
    public: 
     typedef PersonData* Ptr; 
     PersonData(); 
     PersonId fId; 
     istream& read(std::istream&); 
}; 

istream& PersonData::read(std::istream& is) 
{ 
    is >> fId; 
    return is; 
} 

istream& operator >> (istream& is, PersonData &p) 
{ 
    // is >> p.fId; 
    return p.read(is); 
} 

int main() 
{ 
    ifstream indata; // indata is like cin 
    int i; 
    indata.open("persons.txt", ios::in); // opens the file 

    if(!indata) 
    { // file couldn't be opened 
      cout << "Error: file could not be opened" << endl; 
      exit(1); 
    } 

    int n = 5; 

    PersonData* p; 
    p = (PersonData*) malloc (n * sizeof(PersonData)); 


    while (!indata.eof()) 
    { 
     indata >> p[i]; 
     i++; 
    } 

    for(i = 0; i < n; ++i) 
    { 
     cout << "PersonData [" << i << "] is " << p[i] << endl; 
    } 
    return 0; 
} 

Я хочу использовать функцию-член «читать» на самом деле читать значения в структуры, определенные PersonData. Мой вопрос:

  1. Как читать данные из файла в PersonId структуры, которая хранится в структуры PersonData ??

  2. При чтении PersonData [i], я должен увидеть, что у него есть структура PersonId с обновленным значением.

Надеюсь, теперь мои вопросы понятны?

+0

1. Вы публикуете свой код в третий раз, и я до сих пор не вижу никаких вопросов. 2. Если вы пишете на C++, не используйте malloc (если вы не переопределяете оператор new или не делаете что-то simillar). Вы должны написать p = new Persondata [n]; И в конце delete [] p; 3. Я не вижу никакой реализации оператора >> для PersonId –

ответ

1

ОК, сначала некоторые ворчат :-) Ты говоришь, что хочешь. Вы написали, как вы пытаетесь. Отлично. Я думаю, результат не такой, как вы ожидали. Но вы не сказали нам, какой результат вы получите, и почему вы разочарованы этим. Когда я смотрю на ваш код, он не должен компилироваться. Проблема здесь:

istream& PersonData::read(std::istream& is) 
{ 
    is >> fId; 
    return is; 
} 

Я не могу видеть любой оператор >> определены для типа PersonId, и FID имеет тип PersonId. Я прав? Или, может быть, есть оператор >>, определенный где-то, и вы не просто вложили его в свой вопрос? Мой хрустальный шар неясен. Если я угадал правильно, то решение дается Dave Gamble:

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

Вы написали «по-прежнему получаю сообщение об ошибке при попытке получить доступ к PersonData». Кажется, что на этот раз хрустальный шар Дэйва также неясен, он не может сказать, какие у вас проблемы. Я тоже. Я должен либо предоставить нам подробности, либо отправить нам лучшие хрустальные шары. Возможно, вы пропустили его другой совет. Также исправьте cout, чтобы использовать p [i] .fId.fId."Это означает, что вместо того, чтобы писать

cout << "PersonData [" << i << "] is " << p[i] << endl; 

вы должны написать

cout << "PersonData [" << i << "] is " << p[i].fId.fId << endl; 

Там может быть еще одна проблема - вы не обращаясь к членам станд пространства имен, следовательно, - иногда вы пишете IStream, а иногда напишите std :: istream, вы пишете endl вместо std :: endl. Возможно, поиск Koenig работает для вас, я плохо разбираюсь в этом, но добавление std :: prefix может помочь (конечно, если это ваша проблема)

2

У вас есть:

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

отсутствует, после того, как PersonId структуры;

Это нужно, чтобы сделать работу >> fId внутри read() корректной.

Кроме того, исправьте cout, чтобы использовать p [i] .fId.fId.

Отлично работает!

На стилистической ноте, теперь вы находитесь на C++, не используйте malloc, используйте новые и еще лучше, используйте std :: vector <>, который позаботится о вас.

+1

Должен появиться новый значок «Psionic» - дал ответ, когда не было сформулировано никакого вопроса :-) –

+1

@tkpoec, я пытаюсь что-то решить не знаю. И да, я споткнулся, задавая/формулируя вопросы. Я предполагаю, что у вас уже есть значок критика: P – vivekv80

+0

@tkopec, почему вы благодарны. Вы думаете о номере 24. Да, это почти странно, не так ли? Синий. Хелен. Место. Я могу идти целый день. ;) –

Смежные вопросы