web-dev-qa-db-fra.com

Vérification des erreurs ifstream C ++

Je suis nouveau dans C++ et je veux ajouter la vérification des erreurs à mon code et je veux m'assurer que j'utilise de bonnes pratiques de codage. J'ai lu une ligne d'un fichier ASCII dans une chaîne en utilisant:

ifstream paramFile;
string tmp;

//open input file

tmp.clear();

paramFile >> tmp;

//parse tmp
  1. Comment puis-je vérifier les erreurs pour m'assurer que la lecture du fichier d'entrée a réussi?

  2. Je vois des façons beaucoup plus compliquées de lire à partir d'un fichier ASCII là-bas. La façon dont je le fais est-elle "sûre/robuste"?

22
slowmotionfred

paramFile >> tmp; Si la ligne contient des espaces, cela ne lira pas la ligne entière. Si vous le souhaitez, utilisez std::getline(paramFile, tmp); qui lit jusqu'à la nouvelle ligne. La vérification des erreurs de base se fait en examinant les valeurs de retour. Par exemple:

if(paramFile>>tmp) // or if(std::getline(paramFile, tmp))
{
    std::cout << "Successful!";
}
else
{
    std::cout << "fail";
}

operator>> Et std::getline Renvoient tous les deux une référence au flux. Le flux est évalué en une valeur booléenne que vous pouvez vérifier après l'opération de lecture. L'exemple ci-dessus n'est évalué comme vrai que si la lecture a réussi.

Voici un exemple de la façon dont je pourrais créer votre code:

ifstream paramFile("somefile.txt"); // Use the constructor rather than `open`
if (paramFile) // Verify that the file was open successfully
{
    string tmp; // Construct a string to hold the line
    while(std::getline(paramFile, tmp)) // Read file line by line
    {
         // Read was successful so do something with the line
    }
}
else
{
     cerr << "File could not be opened!\n"; // Report error
     cerr << "Error code: " << strerror(errno); // Get some info as to why
}
16
Jesse Good