2 votes

Lecture d'un fichier (C++)

Je n'arrive pas à comprendre pourquoi il ne lit pas mon fichier...

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

int main()
{
    int acctNum;
    int checks;
    double interest;
    double acctBal;
    double monthlyFee;
    const int COL_SZ = 3;
    ifstream fileIn;
    fileIn.open("BankAccounts.txt");
    if(fileIn.fail())
    {
        cout << "File couldn't open." << endl;
    }
    else
    {
        cout << left;
        cout << "Bank Account records:" << endl;
        cout << setw(COL_SZ) << "Account#" << setw(COL_SZ) <<
            "Balance" << setw(COL_SZ) << "Interest" << setw(COL_SZ) << "Monthly Fee" << setw(COL_SZ) <<
            "Allowed Checks" << setw(COL_SZ) << endl;
        while(fileIn >> acctNum >> acctBal >> interest >> monthlyFee >> checks)
        {
            cout << setw(COL_SZ) << acctNum << setw(COL_SZ) << acctBal << setw(COL_SZ) << interest << setw(COL_SZ) <<
                monthlyFee << setw(COL_SZ) << checks << endl;
        }
    }
    fileIn.close();
    system("pause");
    return 0;
}

J'ai enlevé ios::out et mis ios::in, la même chose s'est produite, pas de données et la même chose en enlevant ios. J'ai créé le fichier à partir d'un programme précédent... dois-je intégrer la lecture du code du fichier dans ce programme ?

The BankAccount.txt file as a picture.

2voto

Doug T. Points 33360

Editer

En regardant vos données, vous ne pouvez pas lire des données aussi complexes avec seulement

while(fileIn >> acctNum >> acctBal >> monthlyFee >> checks)

Ce code est configuré pour lire des données formatées de la manière suivante :

11 12.12 11.11 13.13 14.12
11 12.12 11.11 13.13 14.12
11 12.12 11.11 13.13 14.12

Au lieu de cela, vous devrez lire les différentes chaînes de caractères et autres avant d'extraire les données dont vous avez besoin. Par exemple, pour ignorer le mot "Account" ci-dessous, vous pouvez le lire dans une chaîne fictive

Account Number#1234

 std::string dummy; 
 fileIn >> dummy;   // read up to the whitespace, 
                    // in this case reads in the word "Account"

Ensuite, pour obtenir le numéro, il faut lire la chaîne suivante et extraire le #1234.

 std::string temp; 
 fileIn >> temp;   // read up to the whitespace, 
                    // in this case reads in the word "Number#1234"

Mais vous pouvez aussi utiliser getline à lire jusqu'au # inclus

 std::getline(fileIn, dummy, '#');

Lisez ensuite le numéro qui suit le #

 int acctNum = 0;
 fileIn >> acctNum;

Donc, si vos données sont vraiment formatées comme vous le décrivez, vous devrez passer beaucoup plus de temps à comprendre comment analyser vos données que vous ne l'auriez imaginé. Je n'en sais pas assez sur la façon dont vos données sont censées être traitées pour vous donner une réponse complète, mais ce qui précède devrait, je l'espère, vous aider à démarrer.

(Vous pouvez éventuellement vous familiariser avec les expressions régulières, mais à ce stade, vous souhaitez peut-être vous contenter d'apprendre les bases).

Original

Je viens d'essayer votre code et avec suffisamment de valeurs bien formatées dans l'entrée, il fonctionne dans g++. Cependant, une chose dont je me méfie en regardant votre code est cette ligne :

   while(fileIn >> acctNum >> acctBal >> monthlyFee >> checks)

Si l'un des éléments ci-dessus ne parvient pas à être lu parce que le fichier se termine prématurément, votre cout ne sera pas exécuté, ce qui n'entraînera aucune sortie à l'écran. Votre entrée contient-elle toutes les valeurs ci-dessus ? Sont-elles bien formatées ? Pour déboguer, je pourrais essayer de diviser les lectures :

   while (fileIn)
   {
       fileIn >> acctNum;
       std::cout << "Acct num is:" << acctNum << std::endl;
       ...
   }

ou simplement à l'aide d'un débogueur.

Par exemple, pour cette entrée :

11 12.12 11.11 13.13 14.12

votre code s'imprime

Bank Account records:   
Account#BalanceInterestMonthly FeeAllowed Checks   
11 12.126.93517e-31011.1113 \`

Mais si l'on modifie l'entrée et que l'on ajoute un caractère non numérique aléatoire quelque part, c'est-à-dire que l'on ajoute un caractère non numérique aléatoire :

11 * 12.12 11.11 13.13 14.12

me permet d'obtenir juste

Bank Account records:     
Account#BalanceInterestMonthly FeeAllowed Checks

C'est pourquoi j'examinerais certainement, pièce par pièce, ce qui est lu et d'où provient la lecture. fileIn est défaillant, ce qui est certainement la cause de vos problèmes.

Vous savez bien sûr qu'il faut retirer le ios::out comme spécifié aquí

1voto

deong Points 2381

Vous avez

fileIn.open("BankAccounts.txt", ios::out);
                                ^^^^^^^^

Vous ouvrez le fichier pour la sortie. Essayez ios::in.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X