123 Michael 456 Calimlim 898 Mykfyy 999 Kyxy 657 mykfyy 898 Help I'm creating a student attendance keeper system. One of the features of my system is that the student need to register(his/her id and name) first to access the system (login with his/her id)The problem is that i don't know and i don't want my student to have a similar ID number Like(e.g 898 Mykfyy and 898 Help)I'm using fstream in my system. I've been thinking that if I want to avoid the duplication i need to Read(ifstream) the .txt file before register(oustream). But i dont know how to read line by line and check if the ID(898) is already use/existed
3 Réponses :
Le moyen le plus simple de le faire est probablement d'utiliser std :: getline pour obtenir la ligne courante sous forme de chaîne:
using namespace std; ifstream in(fileName); string line; while(getline(in, line)) { // --do something with the line-- }
Vous devrez ensuite analyser chaque ligne pour obtenir l'ID correct
Edit: mis à jour pour supprimer eof ()
Cela ne répond pas à la question.
Pourquoi iostream :: eof dans une condition de boucle est-il considéré comme incorrect? < / a>
Cela ne résout pas complètement le problème mais donne un point de départ pour aider l'affiche originale à le résoudre elle-même
voir mon commentaire précédent.
bon point, code original mis à jour - je crois que eof fonctionne avec getline cependant, la chaîne serait juste vide
Cela dépend de la façon dont vous l'avez implémenté.
Je suppose que le nombre de personnes n'est pas trop grand, donc je vérifierais simplement les identifiants avant d'ajouter un nouvel identifiant.
Quelque chose comme Si l'ID existe, ne pas ajouter.
En C ++, on ne traiterait pas des lignes, mais des objets:
#include <limits> #include <cstdlib> #include <vector> #include <string> #include <fstream> #include <iostream> #include <iterator> #include <algorithm> struct student_t { unsigned id; std::string name; }; bool operator==(student_t const &lhs, student_t const &rhs) { return lhs.id == rhs.id; } std::ostream& operator<<(std::ostream &os, student_t const &student) { return os << student.id << ' ' << student.name; } std::istream& operator>>(std::istream &is, student_t &student) { unsigned id; if (!(is >> id)) return is; std::string name; if (!std::getline(is, name)) { return is; } student = student_t{ id, name }; return is; } int main() { char const *filename{ "test.txt" }; std::ifstream input{ filename }; if (!input.is_open()) { std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n"; return EXIT_FAILURE; } std::vector<student_t> students{ std::istream_iterator<student_t>{ input }, std::istream_iterator<student_t>{} }; input.close(); std::copy(students.begin(), students.end(), std::ostream_iterator<student_t>{ std::cout, "\n" }); student_t new_student; while (std::cout << "New Student?\n", !(std::cin >> new_student)) { std::cerr << "Input error :(\n\n"; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } auto it{ std::find(students.begin(), students.end(), new_student) }; if (it != students.end()) { std::cerr << "Sorry, but a student with id " << new_student.id << " already exists :(\n\n"; return EXIT_FAILURE; } std::ofstream output{ filename, std::ios::app }; if (!output.is_open()) { std::cerr << "Couldn't open \"" << filename << "\" for writing :(\n\n"; return EXIT_FAILURE; } output << new_student << '\n'; std::cout << "New student [" << new_student << "] added :)\n\n"; }
Si le fichier est volumineux, std :: unsorted_map
peut être une bonne alternative à std :: vector
.
Fourchette. Je fais toujours cela et jette des apostrophes dans des «son» possessifs. Au moins, unordered_map
ne se moque de moi que depuis quelques années. «its» est sur mon dos depuis des décennies.
Veuillez ne pas publier de texte sous forme d'images. Publiez du texte sous forme de texte.
désolé, c'est la première fois que je poste une question avec des photos ~ merci
Ne pouvez-vous pas simplement créer l'ID sous forme de numéro incrémentiel au lieu de permettre à l'utilisateur de choisir un ID #? Ce serait facile et ne nécessiterait pas de recherche. Il vous faudrait simplement savoir combien de lignes vous avez dans votre fichier (ce qui fait moins de 10 lignes de code).