2017-02-09 21 views
-3

Я хочу создать простую программу, которая позволит пользователю создавать/открывать файлы и добавлять к ним текст. Это код, у меня в данный момент:Как открыть файл на основе имени файла, указанного пользователем?

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

using namespace std; 

int main() 
{ 
    cout << "Enter file name:" << endl; 
    char fileName; 
    cin >> fileName; 
    ofstream myFile; 
    myFile.open(fileName, ios::out); 
    myFile << "This is the file text.\n"; 
    myFile.close(); 
    return 0; 
} 

Я получаю следующее сообщение об ошибке в myFile.open(fileName, ios::out):

error: no matching function for call to 'std::basic_ofstream<char>::open(std::__cxx11::string&, const openmode&)'

+1

fileName должно быть строкой –

+1

Не было бы так просто разрешить только 1 символьный файл. – drescherjm

+0

@ Raindrop7 Meh !! –

ответ

1

Если вы посмотрите на сообщение об ошибке, то первая половина того, что в открытых скобках говорит вам ответ. Пользователь вводит символ, имя файла должно быть строкой. Вместо того, чтобы:

char fileName; 

Использование:

string fileName; 
2

Простая проблема, которую вы имеете в том, что переменная filename, которая хранит имя файла типа char. Измените его на string, чтобы он работал.

На другой ноте, попытайтесь разбить сообщение об ошибке вы получили:

no matching function for call to 'std::basic_ofstream::open(std::__cxx11::string&, const openmode&)'

В open(std::__cxx11::string& ... это ясно говорит о том, что тип данных имя файла должно быть string&. Это означало, что у вас была ошибка типа данных, что верно, потому что вы использовали char вместо string.

Другое: использовать символ только в том случае, если вы хотите принять одну букву в качестве входных данных; когда вы хотите взять слово или предложение, сохраните его в строковой переменной и получите его от пользователя, используя функцию getline(). Это упростит вашу жизнь.


Чтобы изменить код, во-первых, изменить переменную оператор объявления для:

string fileName; // std:: is not required as you have the line "using namespace std" 

Во-вторых, изменить входной заявление на имя файла из cin >> filename; в:

getline(cin, fileName); 

Он должен работа после этих изменений.


EDIT: Я нашел peoblem на ваш вопрос. Вы неф изменить открытую команду:

myFile.open(fileName.c_str(), ios::out); 

Как говорится в сообщении об ошибке, функция нуждается в строке, передаваемую к а, тем не менее, когда мы берем строку в качестве входных данных и сохранить его в переменной FileName, он просто преобразует строку в const char *. Это невидимо для вас, когда вы запускаете код, но время от времени он вызывает ошибку.

Это должно определенно работать сейчас.

+0

Я внес эти изменения и все еще получаю сообщение об ошибке, когда я пытаюсь открыть файл («myFile.open (fileName, ios :: out);). ve попытался заменить fileName на «wfldfl», и это нормально сработало. –

+0

*** и все еще получаю сообщение об ошибке, где *** Никто не может помочь, если вы не указали точный текст сообщения об ошибке. – drescherjm

+0

Согласитесь с @drescherjm. в сообщении об ошибке и в какой строке появилось сообщение об ошибке. Это может помочь нам в решении вашей проблемы. –