9
votes

Fstream dans et sur le fichier inexistant

est-il possible d'ouvrir un FRStream sur un fichier qui n'existe pas avec IOS :: In & IOS :: Sortir sans obtenir une erreur?


1 commentaires

N'oubliez pas d'accepter des réponses ou d'aider les répondeurs en leur faisant savoir si vous avez essayé leurs solutions (ou les remplir avec plus de détails afin qu'ils puissent adapter leurs réponses.)


5 Réponses :


0
votes
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  fstream f("test.txt", fstream::in | fstream::out);
  cout << f.fail() << endl;
  f << "hello" << endl;
  f.close();    
  return 0;
}
This code will print 1 and will not create "test.txt" file, if it does not exit. So it is not possible to open and fstream on a file that does not exist without getting an error.

1 commentaires

Voulez-vous dire "filestr.fail ()" et "filestr <<" Bonjour "<< endl;" ?!



1
votes
#include <fstream> 

ofstream out("test", ios::out);
if(!out)
{
    cout << "Error opening file.\n";
    return 1;
}

ifstream in("test", ios::in);
if(!in)
{
    cout << "Error opening file.\n";
    return 1;
}
If an error occurs the message is displayed and one (1) is returned. However it is possible to compile and execute just ofstream out("test", ios::out); and ifstream in("test", ios::in); without any errors. Either way the file test is created.

0 commentaires

10
votes

ouvrir un FStream sur un Fichier qui n'existe pas pour l'entrée et la sortie (accès aléatoire) sans obtenir une erreur, vous devez fournir le drapeaux fstream :: in | Fstream :: out | Fstream :: Trunc dans le Ouvrir (ou constructeur ). Étant donné que le fichier n'existe pas déjà, tronquer le fichier à zéro octets n'est pas un drame.

Vous mai veux une erreur lors de l'ouverture d'un fichier qui n'existe pas lors de la spécification seulement iOS :: in car vous ne serez jamais Être capable de lire à partir du flux de sorte que l'échec tôt dans ce cas empêchera les défaillances surprises plus tard.


1 commentaires

Alors, pourquoi ne pas ouvrir un fichier qui n'existe pas via un objet de classe Fstream lancer une erreur? Exemple: myfile Fstream; myfile.open ("this_file_doesothing in_exist.txt"); // Cela ne jette aucune erreur.



0
votes
std::fstream f("test.txt", std::ios_base::out);
f.close(); //file now exists always
f.open("test.txt", fstream::in | std::ios_base::out);
//f is open for read and write without error
I haven't checked to guarantee that it will open without error, but I feel pretty confident that it should.

0 commentaires

2
votes

La réponse à votre question est de: "Non", ce n'est pas possible dans une seule déclaration C ++.

Oui, beaucoup de gens répondront, que vous pouvez utiliser les drapeaux combinés Fstream :: in | Fstream :: out | Fstream :: Trunc Code>. Mais cette réponse est absurde. FRStream :: Trunc CODE> signifie que le fichier de sortie sera tronqué à la taille zéro lors de l'ouverture. Mais alors, pourquoi voudriez-vous ouvrir un fichier vide em> pour la lecture et l'écriture? À l'exception de l'affaire rare, vous avez besoin d'un fichier de magasin temporaire pour certaines des données de votre application, que vous allez d'abord écrire et plus tard lire, il n'y a aucune utilité pour cette combinaison de drapeaux. P>

Certaines personnes Recommandez d'abord d'essayer d'ouvrir avec Fstream :: in | fstream :: out code> (et éventuels drapeaux similaires comme FRStream: app code> ou fstream :: binaire code> au besoin), puis vérifiez l'état de l'erreur du fichier: si le fichier n'a pas pu être ouvert, puis réessayez l'opération ouverte, y compris | Fstream :: Trunc Code>. Cette solution a cependant plusieurs mises en garde. Par exemple, si votre système de fichiers est monté via NFS, la première tentative d'ouverture du fichier en lecture / écriture peut échouer en raison de problèmes de réseau temporaire. Si la deuxième tentative (celle comprenant le FRStream :: Trunc :: Trunc CODE> Drapeau) puis réussit, il va de vos données blessées, que vous avez collectées jusqu'à présent. P>

La solution sécurisée est de Commencez par ouvrir le fichier uniquement (qui créera le fichier, s'il n'existe pas, mais ne le tronquera pas), puis la fermez immédiatement et ouvrez-la une seconde fois en mode lecture-écriture. Ceci peut être réalisé avec le code suivant: Remarque, qu'un destream code> est d'abord construit puis immédiatement jeté. P>

std::string filename { "test.txt" };
(void) std::ofstream(filename, std::ofstream::app | std::fstream::binary);
std::fstream file(filename, std::fstream::in | std::fstream::out | std::fstream::binary);


1 commentaires

Cela a fonctionné correctement lorsque je devais créer un fichier uniquement lorsqu'il n'existait pas avant de l'ouvrir.