Как превратить System :: String в std :: string без маршалинга? - PullRequest
0 голосов
/ 05 ноября 2018

Каждый пост в интернете говорит мне использовать маршаллинг. Дело в том, что сортировка просто не будет работать в моем приложении Windows Forms. Библиотека сталкивается с формами Windows или чем-то вроде этого «Неоднозначного символа», я уже пытался поместить их в разные пространства имен, я уже пытался объявить пространства имен в других файлах cpp, это просто не будет работать. Я разрабатываю приложение Windows Form, и мне нужно сохранить данные в текстовом формате, используя fstream, но мне нужны мои данные в std :: string, иначе fstream не будет их читать. Но по какой-то причине формы Windows просто вынуждают вас использовать их управляемые классы, иначе говоря String ^. Кто-нибудь знает, как я мог бы выполнить эту задачу? Пожалуйста, я буду так благодарен.

Мой заголовок

#include "NewProject.h"
#include <fstream>
#include <msclr\marshal_cppstd.h> 

Это мой метод загрузки

    private: System::Void Interf_Load(System::Object^  sender, System::EventArgs^  e) {
    ifstream infile;
    bool fresh_start = false;
    infile.open("Data.txt", ios::binary);

    if (infile.fail()) {
        fresh_start = true;
        infile.close();
    }

    if (!fresh_start) {
        size_t index; infile >> index;
        for (size_t i = 0; i < index; i++) {
            string* temp = new string[5];

            for (size_t j = 0; j < 5; j++) {
                infile >> temp[j];
            }
            String^ p1 = gcnew String(temp[0].c_str()); String^ p2 = gcnew String(temp[1].c_str());
            String^ p3 = gcnew String(temp[2].c_str()); String^ p4 = gcnew String(temp[3].c_str());
            String^ p5 = gcnew String(temp[4].c_str()); int valor = int::Parse(p5);

            apu->proyectos.Add(gcnew Project(p1, p2, p3, p4, valor));

        }
    }

Это для сохранения.

private: System::Void button8_Click(System::Object^  sender, System::EventArgs^  e) {

ofstream outfile;
outfile.open("Data.txt", ios::binary);
outfile << apu->proyectos.Count << "\n";

for (size_t i = 0; i < apu->proyectos.Count; i++) {

    std::string u1 = msclr::interop::marshal_as<std::string>(apu->proyectos[0]);
    std::string u2 = msclr::interop::marshal_as<std::string>(apu->proyectos[1]);
    std::string u3 = msclr::interop::marshal_as<std::string>(apu->proyectos[2]);
    std::string u4 = msclr::interop::marshal_as<std::string>(apu->proyectos[3]);
    std::string u5 = msclr::interop::marshal_as<std::string>(apu->proyectos[4]);

    std::string line(std::string(u1 + " " + u2 + " " + u3 + " " + u4 + " " + u5) + "\n");
    char* buffer = &line[0u];
    outfile.write(buffer, line.size());
}




Close();

}

Тогда я получаю 1082 ошибки о неоднозначных символах. Мое приложение работает отлично, когда я удаляю материал Маршалла, так что это виновник.

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