Привет У меня есть код C++, который использует пользовательский ввод для генерации имен файлов для некоторых выходных файлов:
std::string outputName = fileName;
for(int i = 0; i < 4; i++)
{
outputName.pop_back();
}
std::string outputName1 = outputName;
std::string outputName2 = outputName;
outputName.append(".fasta");
outputName1.append("_Ploid1.fasta");
outputName2.append("_Ploid2.fasta");
Где fileName может быть любым словом, которое пользователь может определить с помощью.csv после него, например, '~/Desktop/mytest.csv'
Код chomps.csv выключен и создает три имени файла/пути для 3 потоков вывода.
Затем он создает их и пытается их открыть:
std::ofstream outputFile;
outputFile.open(outputName.c_str());
std::ofstream outputFile1;
outputFile1.open(outputName1.c_str());
std::ofstream outputFile2;
outputFile2.open(outputName2.c_str());
Я обязательно передал имена для открытия в качестве const char * с помощью метода c_str, однако, если я проведу свой код, добавив следующую строку:
std::cout << outputFile.is_open() << " " << outputFile1.is_open() << " " << outputFile2.is_open() << std::endl;
и компиляция и установка fineName как "test.csv". Однако я успешно компилирую и запускаю,
Три нули печатаются на экране, показывая, что три фильтра для выхода не являются фактически открытыми. Почему они не открываются? Я знаю, передавая строки, поскольку имена файлов не работают, поэтому я думал, что конвертация с c_str() будет достаточной.
Спасибо, Бен У.
Вероятно, ваша проблема связана с путём, начинающимся с ~
, который не расширяется до /{home,Users}/${LOGNAME}
.
Этот ответ: Как создать папку в домашнем каталоге? может быть вам полезен.
К сожалению, нет стандартного портативного способа выяснить, почему open()
не удалось:
Я знаю, передавая строки, поскольку имена файлов не работают, поэтому я думал, что конвертация с
c_str()
будет достаточной.
std::basic_ofstream::open()
делает принять const std::string &
(начиная с C++ 11)!