Я новичок в программировании, поэтому мне нужна ваша помощь, просто я пытаюсь создать программу с Text to Speech C ++ в Visual Studio 2015 для Windows 10 с использованием объекта Speech Synthesizer в консольном приложении CLR. Но я не могу понять, как провести строку через переменную «t», чтобы говорить не только на synth-> Speak («Строка сохранена»); и synth-> Speak («Линия существует»); , но с «т», как это: «Строка (текстовая строка) существует». Так как я могу передать строку Speak
функционировать?
Можете ли вы помочь мне выяснить:
#include "stdafx.h"#include <conio.h>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
using namespace System;
using namespace System::Speech::Synthesis;
using namespace System::IO;
const string FILE_NAME = "lines.txt";
vector<string> getFileLines(string file) {
ifstream in(FILE_NAME);
vector<string> lines;
for (string line; getline(in, line); ) {
lines.push_back(line);
}
return lines;
}
string getUserInput() {
string str;
getline(cin, str);
return str;
}
int main()
{
vector<string> lines = getFileLines(FILE_NAME);
ofstream fileOut(FILE_NAME, ios::app);
for (int n = 0; n < 10; n++)
{
cout << "Write: > ";
std::string t = getUserInput();
auto it = std::find(lines.begin(), lines.end(), t);
if (it == lines.end()) {
fileOut << t << endl;
lines.push_back(t);
cout << "Line \"" << t << "\" saved.\n";
SpeechSynthesizer^ synth = gcnew SpeechSynthesizer();
synth->Speak("Text saved");
}
else
{
cout << "LIne \"" << t << "\" exist.\n";
SpeechSynthesizer^ synth = gcnew SpeechSynthesizer();
synth->Speak("Line exist");}
}
cout << endl;
getUserInput();
return 0;
}
и так с маршалом
#include "stdafx.h"#include <conio.h>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace msclr::interop;
using namespace std;
using namespace System;
using namespace System::Speech::Synthesis;
using namespace System::IO;
const string FILE_NAME = "lines.txt";
vector<string> getFileLines(string file) {
ifstream in(FILE_NAME);
vector<string> lines;
for (string line; getline(in, line); ) {
lines.push_back(line);
}
return lines;
}
string getUserInput() {
string str;
getline(cin, str);
return str;
}
int main()
{
vector<string> lines = getFileLines(FILE_NAME);
ofstream fileOut(FILE_NAME, ios::app);
for (int n = 0; n < 10; n++)
{
cout << "Write: > ";
std::string t = getUserInput();
auto it = std::find(lines.begin(), lines.end(), t);
if (it == lines.end()) {
fileOut << t << endl;
lines.push_back(t);
cout << "Line \"" << t << "\" saved.\n";
String^ str = marshal_as<String^>(str);
std::string line = "Line " + t + " exists!";
synth->Speak(marshal_as<String^>(line));
}
else
{
cout << "LIne \"" << t << "\" exist.\n";
String^ str = marshal_as<String^>(str);
std::string line = "Line " + t + " exists!";
synth->Speak(marshal_as<String^>(line));
}
}
cout << endl;
getUserInput();
return 0;
}
Я получил это ошибки:
Ошибка C4996
«Msclr :: Interop :: error_reporting_helper<_To_Type, _From_Type, ложь>:: marshal_as’:
Это преобразование не поддерживается библиотекой или файлом заголовка
Необходимые для этого преобразования не включены.Ошибка C2065 ‘_This_conversion_is_not_supported’: необъявленный идентификатор
X_TTS2 c: \ program files (x86) \ Microsoft Visual Studio
14.0 \ vc \ include \ msclr \ marshal.h 219
Согласно документации:
Если вы попытаетесь упорядочить пару типов данных, которые не поддерживаются,
marshal_as
сгенерирует ошибку C4996 во время компиляции. Прочтите сообщение с этой ошибкой для получения дополнительной информации. Ошибка C4996 может быть сгенерирована не только для устаревших функций. Одним из примеров этого является попытка упорядочить пару типов данных, которые не поддерживаются
Поддерживаемые преобразования документированы:
marshal_as()
Функция поддерживает маршалинг std::string
к System::String^
если вы используете marshal_cppstd.h
, что делает ваш пример:
#include <msclr\marshal_cppstd.h>
std::string line = "Line " + t + " exists!";
synth->Speak(marshal_as<String^>(line));
Так что ошибка, которую вы показываете, не имеет смысла, если только она не ссылается на это утверждение:
String^ str = marshal_as<String^>(str);
Вы пытаетесь собрать String^
к String^
, который не поддерживается маршалом преобразования. Кроме того, используя переменную в том же операторе, которая объявляет, что она в любом случае является неопределенным поведением, вам необходимо полностью удалить инструкцию, так как она бесполезна.
С другой стороны, marshal_as()
поддерживает маршалинг const char*
если вы используете marshal.h
:
#include <msclr\marshal.h>
std::string line = "Line " + t + " exists!";
synth->Speak(marshal_as<String^>(line.c_str()));
Других решений пока нет …