Как сохранить файл на рабочий стол в C ++? - PullRequest
0 голосов
/ 16 февраля 2012

Я хочу найти способ сохранить файл на рабочий стол. Поскольку у каждого пользователя свое имя, я обнаружил, что следующий код поможет мне найти путь к чужому рабочему столу. Но как я могу сохранить следующее на рабочий стол? file.open(appData +"/.txt"); не работает. Можете ли вы показать мне пример?

#include <iostream>
#include <windows.h>
#include <fstream>
#include <direct.h>
#include <shlobj.h>
using namespace std;
int main ()
{
    ofstream file;  

    TCHAR appData[MAX_PATH];
    if (SUCCEEDED(SHGetFolderPath(NULL,
                                  CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE,
                                  NULL,
                                  SHGFP_TYPE_CURRENT,
                                  appData)))

    wcout << appData << endl; //This will printout the desktop path correctly, but
    file.open(appData +"file.txt"); //this doesn't work
    file<<"hello\n";
    file.close();
    return 0;
}

Microsoft Visual Studio 2010, Windows 7, консоль C ++

ОБНОВЛЕНИЕ:


#include <iostream>
#include <windows.h>
#include <fstream>
#include <direct.h>
#include <shlobj.h>
#include <sstream> 
using namespace std;
int main ()
{
    ofstream file;  

    TCHAR appData[MAX_PATH];
    if (SUCCEEDED(SHGetFolderPath(NULL,
                                  CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE,
                                  NULL,
                                  SHGFP_TYPE_CURRENT,
                                  appData)))

    wcout << appData << endl; //This will printout the desktop path correctly, but
    std::ostringstream file_path; 
    file_path << appData << "\\filename.txt";//Error: identifier file_path is undefined

    file.open(file_path.str().c_str()); //Error:too few arguments in function call
    return 0;
}

Ответы [ 4 ]

3 голосов
/ 16 февраля 2012

Вы не можете объединить массив TCHAR, используя appData +"/.txt".Используйте stringstream, чтобы создать путь и извлечь из него полный путь к файлу:

#include <sstream>

...

std::ostringstream file_path;
file_path << appData << "\\filename.txt";

file.open(file_path.str().c_str());

РЕДАКТИРОВАТЬ:

Следующие компилируются и выполняются правильно для меня с VS2010:

#include <iostream>
#include <windows.h>
#include <fstream>
#include <direct.h>
#include <shlobj.h>
#include <sstream>
#include <tchar.h>
using namespace std;
int main ()
{
    ofstream file;  

    TCHAR appData[MAX_PATH];
    if (SUCCEEDED(SHGetFolderPath(NULL,
                                  CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE,
                                  NULL,
                                  SHGFP_TYPE_CURRENT,
                                  appData)))

    wcout << appData << endl;
    std::basic_ostringstream<TCHAR> file_path;
    file_path << appData << _TEXT("\\filename.txt");

    file.open(file_path.str().c_str());
    file<<"hello\n";
    file.close();

    return 0;
}
0 голосов
/ 16 февраля 2012

Я не уверен, доступно ли это:

file.open("%userprofile%\\Desktop\\file.txt", fstream::out);

Вы можете попробовать.

0 голосов
/ 16 февраля 2012

Вы должны использовать PathAppend для объединения путей, которые будут обрабатывать пропущенный и / или дополнительный набор символов обратной косой черты (\).

0 голосов
/ 16 февраля 2012
file.open(appData +"/.txt");

В этом пути к файлу нет имени файла.

Также этот вызов функции недопустим.Вы должны передать второй параметр как открытый тип.

file.open(appData +"/file.txt", fstream::out); 

является правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...