Нужна помощь при вводе информации из текстового файла в структуру с помощью рекурсии? - PullRequest
0 голосов
/ 28 апреля 2011

Я абсолютный новичок в C ++ и программировании в целом, поэтому, пожалуйста, потерпите меня, пока я пытаюсь объяснить.

Мне нужно ввести информацию в структуру из файла .txt.Информация в текстовом файле выглядит так:

Джо

11 12 13

Салли

10 11 12

...

В значительной степени структура должна содержать имя a (в случае 1, 11), b (в случае 1, 12) и c (в случае 1, 13).Я хочу сделать это рекурсивно, чтобы оно проходило через все имена и a, b и c.Я действительно в растерянности, с чего начать, и я просто ищу какое-то руководство.

Я думал, может быть, поместив имена в один массив двумерных символов, а a, b и c - в другойМассив трехмерных символов?Но я не совсем уверен, как это сделать, или какую цель это даст.

Спасибо за любую помощь!

Хорошо, вот что у меня есть.Это на очень ранних стадиях, но это что-то.

#include<iostream>
#include<fstream>
using namespace std;

const int max_names=100, a=100, b=100, c=100;
char names[max_names];
int num1[a];
int num2[b];
int num3[c];


int main()
{
    ifstream inFile;
    inFile.open("data.txt");
    while(!inFile.eof())
    {
        for(int i=0; i<max_names; i++)
        {
                inFile>>names[i]>>num1[i]>>num2[i]>>num3[i];
        }
    }
    return 0;
}

struct Person
{
    char names[max_names];
    int num1[a];
    int num2[b];
    int num3[c];
}

РЕДАКТИРОВАТЬ: Хотя я хотел бы не использовать рекурсию / структуры, я должен для класса.Кроме того, после дальнейшего изучения того, что я должен делать, мне нужно создать массив структур.Это сложно сделать?Я сейчас работаю над тем, что я думаю о некотором коде, но я, вероятно, полностью отключусь.

Мне нужно использовать идентификатор структуры.Как "struct Person"

EDIT 2: Да, рекурсия, да структуры, нет итерации, нет класса.Он должен использовать рекурсию и структуру.

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Я хотел бы использовать ifstream для чтения из файла в базовом цикле. Я думаю, что рекурсия не является правильным инструментом для этой работы.

#include <iostream>
#include <fstream>
using namespace std;

int main () {    
  ifstream ifs("test.txt");

  while (ifs.good()) {
    struct foo;
    ifs >> foo.name >> foo.a >> foo.b >> foo.c;
  }

  ifs.close();    
  return 0;
}

Это позволит любому пробелу отделить name, a, b и c. Если вы хотите быть более осторожным с пробелами (например, разрешить пробелы в именах, вы можете использовать peek(), чтобы проверить наличие новых строк, или переключиться на что-то вроде fscanf .

0 голосов
/ 28 апреля 2011

Похоже, вы хотите определить class Person:

class Person {
  std::string name_;
  int numbers[3]; // Is this always 3 ? 
public:
  Person(std::istream& input)
  {
    std::getline(input, name_); // First line is name.
    input >> numbers[0] >> numbers[1] >> numbers[2];
    std::ignore(INT_MAX, '\n'); // Eat newline.
    // Can you 100% rely on the input being correct? 
    // If not, you'll need to throw an exception: if (input.fail()) throw ...
  }

  std::string const& name() const { return name_; }
  int a() const { return numbers[0]; }
  int b() const { return numbers[1]; }
  int c() const { return numbers[2]; }
};

С помощью этого класса вы можете создавать Person из IOstream, пока не нажмете EOF.

...