Lire les fichiers texte nommés par ordre numérique dans un dossier avec une largeur de nom de fichier fixe

Lire des fichiers texte nommés de manière séquentielle dans un dossier

Prenons l'exemple du dossier oxts de l'ensemble de données kitti, il y a une série de fichiers de données sous le dossier de données, chaque nom de fichier est de 0000000000.txt à 0000000123.txt, et le nom de fichier est de 10 chiffres + format txt,

        string path;
       char buf[20];
  for (int i = 0; i <=123; i++) {
        std::sprintf(buf, "%010d", i);
       path = "/data/"  +std::string(buf) +".txt";

    ifstream file(path.c_str());
...
}

Ce code utilise la fonction sprintf de la bibliothèque standard C++ pour formater l'entier i en une chaîne à trois chiffres et le stocker dans un tableau de caractères nommé buf. Ensuite, utilisez l'opérateur d'épissage de chaîne en C++ pour épisser la chaîne dans buf avec d'autres chaînes pour finalement former une chaîne de chemin de fichier, qui est la valeur de la variable de chemin. Le format de cette chaîne de chemin de fichier est : "/data/" + chaîne de 10 chiffres + ".txt". Parmi eux, la chaîne de 10 chiffres est générée par la fonction sprintf, qui formate i en une chaîne de 10 chiffres, et les nombres de moins de 10 chiffres seront remplis de zéros à gauche.

buf[a], a doit être supérieur au nombre de chiffres du nom du fichier, dans ce cas il est 10, il peut être plus grand.

 

 absurdité

Ce qui suit est un non-sens GPT, vous n’avez donc pas besoin d’en lire davantage.

Ce code génère une chaîne de chemin de fichier pour ouvrir ou créer un fichier. Le format de la chaîne de chemin est fixe et la partie numérique change en fonction de la valeur de la variable i. Par exemple, lorsque la valeur de i est 0, la chaîne de chemin est « /data/000000000.txt », lorsque la valeur de i est 1, la chaîne de chemin est « /data/000000001.txt », et ainsi de suite.

Ce code peut être utilisé dans un programme qui génère un grand nombre de fichiers, comme l'analyse de données, la journalisation, etc. En générant différentes chaînes de chemin de fichier, le programme peut stocker des données ou des journaux dans différents fichiers pour un traitement et une analyse ultérieurs. Lors de la génération d'une chaîne de chemin de fichier, utilisez la fonction sprintf pour convertir facilement des nombres en chaînes et contrôlez le format de la chaîne afin que la chaîne de chemin générée

Plus standardisé et plus facile à gérer. Dans le même temps, l'utilisation d'opérateurs d'épissage de chaînes pour assembler différentes chaînes peut éviter les erreurs et les inconvénients qui se produisent lors de l'épissage manuel des chaînes.

si char buf[2];std::sprintf(buf, "%03d", i);

Il convient de noter qu’il existe des problèmes potentiels avec ce code. Premièrement, la taille du tableau buf n'est que de 2 et la longueur de la chaîne générée par la fonction sprintf peut dépasser 2, ce qui peut provoquer un débordement du tableau buf, entraînant des plantages du programme ou des failles de sécurité. Deuxièmement, la partie numérique dans la chaîne de chemin ne peut représenter qu'un maximum de fichiers 999. Si vous devez générer plus de fichiers, vous devez modifier le code pour prendre en charge plus de nombres.

Par conséquent, lorsque vous utilisez ce code, vous devez vous assurer que le tableau buf est suffisamment grand pour accueillir les chaînes générées, et vous devez également réfléchir à la manière de gérer la situation au-delà de 999 fichiers. Une solution consiste à augmenter le nombre de bits dans la partie numérique pour prendre en charge davantage de fichiers, mais cela augmente également la longueur de la chaîne de chemin et peut entraîner une dégradation des performances du système de fichiers. Une autre solution consiste à utiliser d'autres schémas de dénomination de fichiers, par exemple en utilisant des identifiants uniques tels que des horodatages et des GUID pour nommer les fichiers afin d'éviter le problème des noms de fichiers en double.

En plus des problèmes ci-dessus, il existe des problèmes potentiels multiplateformes avec ce code. Par exemple, le séparateur de chemin peut être différent selon les systèmes d'exploitation, vous devez utiliser l'API fournie par le système d'exploitation pour obtenir le séparateur de chemin correct. De plus, le nom du fichier peut contenir certains caractères spéciaux, tels que des espaces, des barres obliques, etc., qui doivent être correctement échappés ou codés pour éviter les erreurs d'analyse du nom de fichier ou les failles de sécurité.

Pour résumer, ce code génère une chaîne de chemin de fichier pour ouvrir ou créer un fichier. Il utilise la fonction sprintf de la bibliothèque standard C pour formater le nombre en chaîne et utilise l'opérateur de concaténation de chaînes pour concaténer différentes chaînes. Lorsque vous utilisez ce code, vous devez faire attention à la taille du tableau buf et au nombre de chiffres dans la partie numérique, et vous devez également prendre en compte des problèmes tels que la sécurité multiplateforme et le nom de fichier.

Si vous souhaitez améliorer ce code, il y a plusieurs aspects à considérer :

1. Utilisez la classe de chaînes de la bibliothèque standard C++ pour remplacer les fonctions de tableau de caractères et d'opération de chaîne dans la bibliothèque standard C, ce qui peut éviter certains problèmes de sécurité potentiels et est également plus facile à utiliser et à gérer.

2. Utilisez l'API fournie par le système d'exploitation pour obtenir le séparateur de chemin correct et les règles d'encodage des noms de fichiers afin de garantir la compatibilité multiplateforme et la sécurité des noms de fichiers.

3. Envisagez d'utiliser d'autres schémas de dénomination de fichiers, tels que des identifiants uniques tels que des horodatages et des GUID, pour éviter le problème des noms de fichiers répétés.

4. Envisagez de séparer la génération des chaînes de chemin d'accès aux fichiers des opérations sur les fichiers pour améliorer la maintenabilité et la testabilité du code. La génération de la chaîne de chemin de fichier peut être encapsulée dans une fonction ou une classe, de manière à être appelée lorsque la chaîne de chemin de fichier doit être générée. L'opération sur le fichier peut être encapsulée dans une autre fonction ou classe à appeler lorsque le fichier doit être ouvert ou créé. Cela sépare les différentes fonctions du code, rendant le code plus modulaire et réutilisable.

5. Envisagez d'utiliser des fonctionnalités C++ plus modernes, telles que la bibliothèque std::filesystem pour gérer les chemins de fichiers et les opérations sur les fichiers, afin d'améliorer la lisibilité et la maintenabilité du code.

Pour résumer, ce code peut être amélioré en utilisant des fonctionnalités C++ et des techniques de programmation plus modernes pour améliorer la sécurité, la maintenabilité et la réutilisabilité du code.

おすすめ

転載: blog.csdn.net/weixin_56337147/article/details/130527135