Сохранить файл в папку и имя, определенное пользовательским вводом в C ++ - PullRequest
0 голосов
/ 06 апреля 2011

У меня возникли проблемы с сохранением текстового файла, созданного в окне консоли, в пользовательское расположение, определяемое пользовательским вводом. Я хочу, чтобы он взял строку filepath, которая будет местом сохранения, и объединит ее со строкой filename, которая будет именем текстового файла, который выбрал пользователь. Например, это C:\users\bobbert\desktop\c++.txt. Затем я хочу получить третью строку, которая будет фактическим текстом для записи в файл c ++. Txt. Вот мой код:

cout<<"Please enter a name for your file: "<<endl;
cin>>filename;

cout<<"Please enter a directory to save your file in: "<<endl;
cin>>filepath;

//user is now typing data into the text file
cin>>data;
//the data is now being grabbed and put into the "Data" string

FILE * pFile;
pFile = fopen (filepath.c_str() + filename.c_str(),"a");

//trying to combine the users selected directory + the selected filename here

if (pFile!=NULL)
{
    fputs(data.c_str(), pFile);
    //here i am trying to take the data of the .txt file
    //string and put it into the new file
}

fclose (pFile);

Спасибо, что нашли время, чтобы прочитать это! :)

Ответы [ 3 ]

5 голосов
/ 06 апреля 2011

filepath.c_str() + filename.c_str() не объединяет строки, поскольку они являются указателями на массивы символов, а не на объекты C ++ std::string.Вы просто [пытаетесь] выполнять арифметику с указателями.

Попробуйте:

std::string filename, filepath, data;

cout << "Please enter a name for your file: " << endl;
cin >> filename;

cout << "Please enter a directory to save your file in: " << endl;
cin >> filepath;

//user is now typing data into the text file
cin >> data;

//the data is now being grabbed and put into the "Data" string
ofstream fs((filepath + "/" + filename).c_str(), ios_base::app);

//trying to combine the users selected directory + the selected filename here
if (fs)
   fs << data;

Я заменил использование вами стиля C fopen потоком C ++объект, исправил проблему со строкой и добавил обратную косую черту между filepath и filename (в целях безопасности на случай, если пользователь ее не напишет).

Обратите внимание, что вам все равно нужно выполнить .c_str() в результате std::string конкатенации при передаче готового пути в конструктор ofstream, потому что iostreams были разработаны до библиотеки строк.Это просто неприятный C ++ - изм.

1 голос
/ 06 апреля 2011

В истинном духе c ++

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::string filename, filepath, data;

    std::cout << "Please enter a name for your file: " << std::endl;
    std::cin >> filename;

    std::cout <<" Please enter a directory to save your file in: " << std::endl;
    std::cin >> filepath;

    std::ofstream file((filepath + "/" + filename).c_str());

    //std input is being copied to the file
    file << std::cin.rdbuf();
    file << std::flush;
    file.close();

    return 0;
}

В духе C для объединения пути

{
    char* fspec;
    if (-1 == asprintf(&fspec, "%s/%s", filepath.c_str(), filename.c_str()))
        { perror("asprintf"); return 255; }
    std::cout << fspec << std::endl;
    free(fspec);
}

Мне было не совсем понятно, как вы будете требовать обработки ввода;Если вы предпочитаете, вы можете читать его в буфер памяти разными способами, например, без потери пробела:

std::stringstream ss;
ss << std::cin.rdbuf();

// OR
std::copy(std::istreambuf_iterator<char>(std::cin) ,
        std::istreambuf_iterator<char>(),
        std::streambuf_iterator<char>(ss));

.... и несколько альтернатив, которые удаляют пробелы:

std::copy(std::istream_iterator<std::string>(std:: cin),
        std::istream_iterator<std::string>(),
        std::stream_iterator<std::string>(ss));

bool my_isspace(char c) { return std::isspace(c); } // in namespace scope
std::remove_copy_if(std::istreambuf_iterator<char> (std::cin),
        std::istreambuf_iterator<char>(),
        std::streambuf_iterator<char>(ss), my_isspace);
0 голосов
/ 06 апреля 2011

Завершает ли пользователь вводную строку обратной косой чертой? Если нет, то ваш путь неверен.

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