Я пытался написать простую программу базы данных. Проблема в том, что ofstream НЕ хочет создавать новый файл.
Вот выдержка из оскорбительного кода.
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;
}
}
РЕДАКТИРОВАТЬ: ОК, только что попробовал
#include <fstream>
using namespace std;
int main()
{
ofstream writeDB ("C:\\test.cla");
writeDB << "test";
writeDB.close();
return 0;
}
и это не сработало, так что это проблемы с доступом.
ofstream writeDB(fname); //-> replace fname with fname.c_str()
Если вы посмотрите документацию конструктора ofstream, вы увидите что-то вроде:
явный ofstream (const char * filename, ios_base :: openmode mode = ios_base :: out);
Второй аргумент является необязательным, но первый является const char *, а не строкой. Чтобы решить эту проблему, самый простой способ — преобразовать вашу строку в нечто, называемое C-строкой (char *, который в основном является массивом символов); Для этого просто используйте c_str () (это часть библиотеки).
Кроме этого, вы можете просто разместить информацию непосредственно на C-str, а затем передать ее обычному конструктору ofstream.
Других решений пока нет …