1
votes

Comment rechercher ligne par ligne dans un fichier texte

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 commentaires

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).


3 Réponses :


1
votes

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 ()



0
votes

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.


0 commentaires

2
votes

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";
}


2 commentaires

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.