est-il possible d'ouvrir un FRStream sur un fichier qui n'existe pas avec IOS :: In & IOS :: Sortir sans obtenir une erreur? P>
5 Réponses :
#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.
Voulez-vous dire "filestr.fail ()" et "filestr <<" Bonjour "<< endl;" ?!
#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.
ouvrir un Vous mai em> veux une erreur lors de l'ouverture d'un fichier qui n'existe pas lors de la spécification seulement em> FStream code>
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 em> fstream :: in | Fstream :: out | Fstream :: Trunc Code> dans le
Ouvrir code>
(ou constructeur ). Étant donné que le fichier n'existe pas déjà, tronquer le fichier à zéro octets n'est pas un drame. P>
iOS :: in code> 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. P>
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.
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.
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 Certaines personnes Recommandez d'abord d'essayer d'ouvrir avec 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 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>
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>
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);
Cela a fonctionné correctement lorsque je devais créer un fichier uniquement lorsqu'il n'existait pas avant de l'ouvrir.
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.)