2009-04-01 9 views
0

J'ai donc un type d'objet de classe, myClass classType comme global. ce qui est pas happeing est que préféreraient avoirlire le fichier texte dans le tableau de type d'objet de classe (C++)

// MyClass.h 
{ 
    private: 
    char FirstName; 
    char LastName; 
    char MiddleName; 
    int ID; 
    int Age; 
}; 

// Globals 
const int myIndex = 256; 
myClass classType[ myIndex ]; 

int main() 
{ 

    // assume preprocessors are included 

    cout << "Enter File: "; 
    cin >> cArray; 
    if (!inFile.good()) 
    { 
    cout << "Wrong?" << endl; 
    } 
    inFile.open(cArray); 
    while (!inFile.eof()) 
    { 
    linecount++ // giving me 1 and not counting the file lines 

inFile.read((char *) &myType[linecount], sizeof(myClass)); 

    } 
} 

Voilà une idée approximative de ce qui ressemble comme principale pour moi aujourd'hui. Je n'ai pas encore utilisé myClass.cpp! Mon fichier texte est de ce format:

FirstName LastName Numéro ID Âge ...

Après le débogage, je remarque que le caractère de nouvelle ligne n'a pas été détecté et maintenant tout est en EN BOTTES, sur la même index! Comme mon incrément ne fonctionnait pas ou quelque chose ..

Je voulais incrémenter pour autant de lignes qu'ils sont dans le fichier. (plus d'un) J'essaie de réparer le linecount (idx) dans l'espoir de résoudre complètement ce problème.

Mes membres privés, FirstName LastName, et ainsi de suite comme je l'ai écrit ci-dessus sont présents lors du débogage et en faisant glisser sur le myclasstype. J'ai juste besoin de les obtenir avec leur propre varaible. J'espère juste que la fonction ifstream :: read() ne me mène pas dans une mauvaise direction.

Avez-vous des suggestions?

+0

Vos noms sont déclarés comme étant seulement un seul caractère chacun, ce qui semble incorrect. – unwind

+0

Votre code comporte un certain nombre de problèmes qui l'empêcheront de se compiler. Vous avez besoin de "struct myClass" devant la définition de cette classe; vous devez déclarer cArray, linecount et inFile quelque part; FirstName, LastName et MiddleName sont actuellement un seul caractère chacun. –

+0

Votre problème ressemble beaucoup à un devoir. Vous devriez le comprendre par vous-même en fonction du matériel de cours que vous avez. Cela vous permettra d'apprendre quelque chose au lieu de simplement passer le devoir avec une solution d'ici. – lothar

Répondre

0
  • J'ai recommandé l'utilisation de boost :: serialization pour les mêmes objectifs.
  • Pourquoi incrémenter le nombre de lignes avant de lire une ligne? Vous laissez le premier élément de myType non initialisé.
  • Si vous utilisez un format de fichier texte, pourquoi utilisez-vous la fonction de lecture?
0

Plusieurs points;

  • Qu'est-ce que cArray?
  • vous devez vérifier que le fichier ouvert à l'aide is_open()
  • la fonction EOF() ne détecte que la fin du fichier après avoir lu quelque chose
  • vous devriez utiliser std :: getline() pour lire les lignes
  • comme l'a souligné dans un commentaire, le nom de votre classe sont simples caractères, ils doivent être std :: cordes
0

Vous approchez avec lecture (BUF, la taille) ne fonctionnera pas si vos données provient de un fichier texte. Il remplira buf avec tous les octets sont lus à partir de l'entrée. Vous ne pouvez pas "remplir" un objet quelque part dans la mémoire de cette façon. read (buf, size) ne fonctionne qu'avec des données binaires.

Je surchargerais l'opérateur de flux >> pour faire l'analyse réelle des données de texte. La sortie sera stockée dans l'objet passé comme référence:

istream& operator>> (istream& in, MyClass& val);

1
// MyClass.h 
{ 
    private: 
    char FirstName; 
    char LastName; 
    char MiddleName; 
    int ID; 
    int Age; 
}; 

Quel est ce struct/classe?Je suppose que c'est ma classe. En tout cas myClass n'est pas un nom significatif.

  1. Prénom/Nom/Prénom moyen sont des initiales - ce qui signifie que le nom est incorrect - ou sont mal typées. Ce que vous cherchez est plus léger: std :: string ou char *.
  2. Traditionnellement, ID est le premier champ - si nécessaire.

``

// Globals 
const int myIndex = 256; 
myClass classType[ myIndex ]; 

En règle générale - ne jamais utiliser globals. Vous auront probles.

int main() 
{ 

    // assume preprocessors are included 

    cout << "Enter File: "; 
    cin >> cArray; 

Qu'est-ce que cArray?

if (!inFile.good()) 

Où est défini inFile? Pourquoi vérifiez-vous l'état d'E/S avant toute opération E/S sur ce flux?

{ 
    cout << "Wrong?" << endl; 
    } 
    inFile.open(cArray); 

Bien. Est-il pas plus simple d'écrire ifstream inFile(cArray)?

while (! InFile.eof()) { linecount ++ // me donner 1 et sans compter les lignes de fichiers

Vous demandez trop-plein. Que faire si le fichier a plus de 256 lignes? Quel pire programme ne va pas tomber en panne - il écrira probablement dans un endroit non spécifié.

inFile.read((char *) &myType[linecount], sizeof(myClass)); 
  1. Ne jamais utiliser des formats binaires à moins que vous devez. Ils sont très difficiles à déboguer. Si vous avez un bon format de texte simple, tout ce que vous devez tester est un éditeur de texte pour éditer les fichiers d'entrée de test. Avec binary, vous n'avez aucune garantie que le bogue est dans le programme et non dans le cas de test.
  2. Evern si vous faire utiliser le format binaire faire pas lire de cette façon. En fait, vous n'avez aucun moyen de déterminer si le compilateur n'a pas changé les offsets. Par exemple ID aura généralement un décalage de 4 octets. Mais le compilateur est libre de l'optimiser.

    De plus, vous n'avez aucun moyen de déterminer la taille de ID et Age, sauf qu'ils sont plus grands que 2 octets. Ils sont généralement 4, mais sur certains compilateurs 64 bits (à mon humble avis de cette façon est correct où int == mot unique) ils peuvent être 8. Dans le futur, ils peuvent être 16 (s'il y aura des ordinateurs 128 bits). Vous pouvez penser qu'il n'y en a jamais mais de la même façon "768 K était suffisant pour tout le monde" (c'était beaucoup ces jours-là).

Si vous essayez de lire le texte de telle manière

} 
} 

À moins que vous devez valider l'entrée (dans ce cas iostreams n'est pas le meilleur outil):

class person 
{ 
public: 
    person (const std::string &first_name, 
      const std::string &last_name, 
      const std::string &middle_name, 
      int    id, 
      int    age) 
      : m_first_name(first_name), 
      m_last_name(last_name), 
      m_middle_name(middle_name, 
      m_id(id), 
      m_age(age) {} 
private: 
    std::string m_first_name, m_last_name, m_middle_name; 
    int m_id, m_age; 
}; 
// Lots of other code 
std::vector<person> people; 
while(...) 
    { 
    std::string first_name, last_name, middle_name; 
    int id, age; 
    in_file >> first_name >> last_name >> middle_name >> id >> age; 
    person p(first_name, last_name, middle_name, id, age); 
    people.push_back(p); 
    } 

Il peut être raccourci et doit être rempli mais: 1.Utilisez de jolies fonctionnalités C++ telles que STL (vous n'avez pas besoin de vous souvenir de l'index ou vous n'avez pas à vous soucier du dépassement de vecteur) 2. Il utilise le format texte

Questions connexes