2009-10-12 9 views
4

J'essaie de faire les choses les plus élémentaires .... écrire un fichier en C++, mais le fichier n'est pas écrit. Je n'ai pas d'erreurs non plus. Peut-être qu'il me manque quelque chose d'évident ... ou quoi?Impossible d'écrire le fichier en C++

Je pensais que quelque chose n'allait pas avec mon code, mais j'ai aussi essayé un échantillon que j'ai trouvé sur le net et toujours aucun fichier n'est créé.

Voici le code:

ofstream myfile; 
myfile.open ("C:\\Users\\Thorgeir\\Documents\\test.txt"); 
myfile << "Writing this to a file.\n"; 
myfile.close(); 

J'ai aussi essayé de créer le fichier manuellement à l'avance, mais pas du tout mis à jour. Je suis sous Windows 7 64 bits si cela a quelque chose à voir avec ça. C'est comme si les opérations d'écriture de fichiers étaient complètement interdites et qu'aucun message d'erreur ou exception n'était affiché.

+0

Je sais que ce n'est pas une solution, mais c'est arrivé avec moi avant. Remplacez simplement ** ofstream ** par ** fstream **. – AraK

+0

Etes-vous sûr qu'il y a un dossier nommé "Documents" là-bas? Si je ne me trompe pas, il est normalement appelé "Mes documents" ... –

+1

@Jerry il a changé de "Documents" depuis Vista. – Corey

Répondre

2

Vous devez ouvrir le fichier en mode écriture:

myfile.open ("C:\\Users\\Thorgeir\\Documents\\test.txt", ios::out); 

Assurez-vous de regarder les autres options pour ce second argument, aussi bien. Si vous écrivez des données binaires, vous aurez besoin de ios::binary par exemple.

Vous devriez aussi vérifier le courant après son ouverture:

myfile.open(... 
if (myfile.is_open()) 
    ... 

Mise à jour:

Arak est juste, j'ai oublié qu'un ofstream est en mode d'écriture par défaut, ce n'est pas le problème.

Peut-être n'avez-vous tout simplement pas d'autorisations d'écriture/création sur le répertoire? Win7 par défaut beaucoup de répertoires avec des autorisations spéciales de "refuser tout". Ou peut-être que ce fichier existe déjà et est en lecture seule?

+3

@Tim Bon point, mais std :: ios :: out est défini par défaut dans le constructeur de ** ofstream **. – AraK

1

Avez-vous lu à propos de l'UAC (User Account Control) et de la virtualisation/de la redirection de données UAC sous Windows Vista et 7? Il est possible que votre fichier se trouve réellement dans le magasin virtuel.

User Account Control Data Redirection

Votre exemple répertoire de sortie est dans les utilisateurs, donc je ne pense pas que ce serait la question, mais il est possible de mentionner et quelque chose qui peut être très frustrant si vous n'êtes pas à la recherche pour il!

Espérons que cela aide.

0

Essayez ceci:

if(! myfile) 
{ 
cerr << "You have failed to open the file\n"; 

//find the error code and look up what it means. 
} 
+0

Comment "trouvez-vous le code d'erreur"? –

+0

@Tomalak: http://msdn.microsoft.com/en-us/library/ms679360(VS.85).aspx –

+0

Il est important de mentionner dans votre réponse que c'est spécifique à Microsoft. C++ n'a pas de "codes d'erreur" pour les échecs de flux; seulement les modes de défaillance. –

2

Commencez en tournant autour de cette barre.
Même Windows comprend que le slash est l'inverse.

ofstream myfile("C:/Users/Thorgeir/Documents/test.txt"); 

Vous pouvez tester s'il y a des erreurs:

if (!myfile) 
{ 
    std::cout << "Somthing failed while opening the file\n"; 
} 
else 
{ 
    myfile << "Writing this to a file.\n"; 
    myfile.close(); 
} 
  • Assurez-vous le répertoire existe.
  • Si le fichier existe assurez-vous qu'il est accessible en écriture (par vous)
  • Vérifiez le répertoire que vous écrivez en est inscriptible (par vous)
+1

Pourquoi recommander l'utilisation d'un séparateur de chemin qui n'est pas natif de la plate-forme cible? Surtout quand ça ne résout rien? Impair. –

+0

@Tomalak: Pas vraiment. L'utilisation du '\' est une erreur sujette au mieux parce que c'est un caractère d'échappement (il n'y a pas de vérification de temps de compilation pour s'assurer qu'il est correctement utilisé). MS a reconnu le problème il y a dix ans et a ajouté un soutien pour le '/' le plan devait être compatible avec les autres systèmes d'exploitation. Malheureusement, ils ont été bloqués dans le problème de compatibilité ascendante/ –

+0

Je ne vois aucun problème avec '\\'. –

1

Ce code devrait capturer toute erreur. Très probablement, c'est une chose de permissions si des erreurs sont rencontrées. Assurez-vous que vous pouvez lire/écrire dans le dossier que vous créez le fichier dans

#include "stdafx.h" 
#include <fstream> 
#include <iostream> 

bool CheckStreamErrorBits(const std::ofstream& ofile); 

int _tmain(int argc, _TCHAR* argv[]) { 
std::ofstream ofile("c:\\test.txt"); 
if(ofile.is_open()) { 
    CheckStreamErrorBits(ofile); 
    ofile << "this is a test" << std::endl; 
    if(CheckStreamErrorBits(ofile)) { 
    std::cout << "successfully wrote file" << std::endl; 
    } 
}else { 
    CheckStreamErrorBits(ofile); 
    std::cerr << "failed to open file" << std::endl; 
} 

ofile.close(); 
return 0; 
} 

//return true if stream is ok. return false if stream has error. 
bool CheckStreamErrorBits(const std::ofstream& ofile) { 
bool bError=false; 
if(ofile.bad()) { 
    std::cerr << "error in file stream, the bad bit is set" << std::endl; 
    bError=true; 
}else if(ofile.fail()) { 
    std::cerr << "error in file stream, the fail bit is set" << std::endl; 
    bError=true; 
}else if(ofile.eof()) { 
    std::cerr << "error in file stream, the eof bit is set" << std::endl; 
    bError=true; 
} 
return !bError; 
} 

Mise à jour:. Je viens de tester mon code sous Windows 7 Enterprize et il a échoué la première fois (échec bit a été défini). Ensuite, j'ai désactivé le contrôle de compte d'utilisateur (UAC) et testé à nouveau et il a écrit le fichier. C'est probablement le même problème que vous voyez. Pour désactiver l'UAC, allez à:

Panneau de configuration (affichage par petites icônes) | Comptes d'utilisateurs | Modifier les paramètres de contrôle de compte d'utilisateur. Réglez-le sur Ne rien notifier, puis cliquez sur le bouton OK. Vous devrez redémarrer pour que les modifications prennent effet.

Je suis curieux de savoir comment le faire fonctionner avec l'UAC, je vais y jeter un coup d'œil.

0

Utilisez FileMon et recherchez les appels WriteFile ayant échoué à partir de votre processus.

Questions connexes