2012-11-13 1 views
0

J'ai essayé d'écrire un programme de base de données simple. Le problème est que ofstream ne veut pas faire un nouveau fichier.Ofstream ne crée pas un nouveau fichier correctement

Voici un extrait du code incriminé.

void newd() 
{ 
string name, extension, location, fname; 
cout << "Input the filename for the new database (no extension, and no backslashes)." << endl << "> "; 
getline(cin, name); 
cout << endl << "The extension (no dot). If no extension is added, the default is .cla ." << endl << "> "; 
getline(cin, extension); 
cout << endl << "The full directory (double backslashes). Enter q to quit." << endl << "Also, just fyi, this will overwrite any files that are already there." << endl << "> "; 
getline(cin, location); 
cout << endl; 
if (extension == "") 
{ 
    extension = "cla"; 
} 
if (location == "q") 
{ 
} 
else 
{ 
    fname = location + name + "." + extension; 
    cout << fname << endl; 
    ofstream writeDB(fname); 
    int n = 1; //setting a throwaway inteher 
    string tmpField, tmpEntry; //temp variable for newest field, entry 
    for(;;) 
    { 
     cout << "Input the name of the " << n << "th field. If you don't want any more, press enter." << endl; 
     getline(cin, tmpField); 
     if (tmpField == "") 
     { 
      break; 
     } 
     n++; 
     writeDB << tmpField << ": |"; 
     int j = 1; //another one 
     for (;;) 
     { 
      cout << "Enter the name of the " << j++ << "th entry for " << tmpField << "." << endl << "If you don't want any more, press enter." << endl; 
      getline(cin, tmpEntry); 
      if (tmpEntry == "") 
      { 
       break; 
      } 
      writeDB << " " << tmpEntry << " |"; 
     } 
     writeDB << "¬"; 
    } 
    cout << "Finished writing database. If you want to edit it, open it." << endl; 
} 
} 

EDIT: OK, juste essayé

#include <fstream> 
using namespace std; 
int main() 
{ 
ofstream writeDB ("C:\\test.cla"); 
writeDB << "test"; 
writeDB.close(); 
return 0; 
} 

et cela ne fonctionne pas, il est donc accès des problèmes d'autorisation.

+0

donne un exemple d'exécution d'un programme et ce que vous entrez. –

+1

vous n'avez pas non plus besoin de "double barre oblique inverse" lors de la saisie de la chaîne de cette façon, uniquement pour les littéraux de chaîne dans votre code. – HerrJoebob

+5

Réduire votre source à * seulement * afficher le problème. Ensuite, vérifiez que c'est bien * le * problème. Je suppose que vous essayez d'ouvrir un fichier dans un endroit drôle qui n'existe pas. Un programme simple pour vérifier que 'std :: ofstream' fonctionne comme prévu serait le suivant:' #include int main() {std :: ofstream out ("empty.txt"); } '. En partant de là, vérifiez où le fichier créé cesse d'être créé. –

Répondre

3
ofstream writeDB(fname); //-> replace fname with fname.c_str() 

Si vous lookup la documentation du constructeur ofstream, vous verrez quelque chose comme: ofstream explicite (const char * nom de fichier, ios_base :: mode openmode = ios_base :: out);

Le second argument est facultatif, mais le premier est un const char * et non une chaîne. Pour résoudre ce problème, le plus simple est de convertir votre chaîne en quelque chose appelé un C-string (char *, qui est essentiellement un tableau de caractères); Pour ce faire, utilisez simplement c_str() (il fait partie de la bibliothèque). A part cela, vous pouvez simplement placer les informations directement sur un C-str, puis le passer normalement au constructeur ofstream.

+4

C++ 11 ajoute un [constructeur] (http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream) qui prend un argument 'std :: string', mais si l'OP utilise un ancien compilateur que le code ne devrait même pas compiler. – Praetorian

+0

Merci pour cela, je l'ai ajouté, mais ça ne marche toujours pas. J'utilise Visual Studio Express 2012 BTW. Merci a tous! –

Questions connexes