zoukankan      html  css  js  c++  java
  • c# 调用 CRFs应用程序

    今天想用C#调用crfs,但是老出问题。原因有几点。第一,我对crf不理解,虽然我用cmd跑了一遍,但是根本不理解为什么,而且只是草草看了下参数该输入什么,只是了解了形式,没有了解实质。所以在调用的时候,我不知道怎样转移输入输出的参数。另外,crf_learn在cmd运行的时候,用到了一个自带的dll文件我也不知道怎么处理。而且我在网上找类似调用的例子也找不到。第二,对找到的实例代码不熟悉,没有理解每一行代码的含义和作用。第三,不知道怎么输出结果,不会适当的断点。

    经过一位同学的帮助,他帮我解决了以问题。最终运行成功。

    Console.WriteLine("aaaaa"); //用于测试输出
    System.Diagnostics.Process p = new System.Diagnostics.Process();  //开始系统进程
    p.StartInfo = new System.Diagnostics.ProcessStartInfo(@"C:UsersAMYDesktop estcrf_learn.exe");  //应用程序路径
    p.StartInfo.Arguments = @" C:UsersAMYDesktop est emplate C:UsersAMYDesktop est rain.data C:UsersAMYDesktop estmodel"; //参数输入
    p.StartInfo.RedirectStandardOutput = true; //结果输出
    p.StartInfo.UseShellExecute = false; //是否在shell中显示
    p.Start();
    //p.WaitForExit();
    Console.WriteLine("nnnn");

    p.Close() //要记得释放资源,不然程序会很慢很慢的。
    Console.ReadKey();

    dll文件在CRFs运行的时候是可以自己找到的,只要你把它和learn.exe文件放在一个文件夹里面。另外test的结果不能通过参数来重定向,所以,只能将输出流保存到字符串,再保存到txt文件。现阶段(2015.11.8)完整的代码为:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO;

    private void start_CRFs_Click_1(object sender, EventArgs e)
    {
    Stopwatch sw = new Stopwatch();
    sw.Start();

    string TrainDirectory = Train_directoryT.Text;
    string ArgumentsStr = tb_Arguments.Text;
    string output = "";
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_learn.exe");
    p.StartInfo.Arguments = ArgumentsStr + " " + TrainDirectory + "template " + TrainDirectory + "train.data " + TrainDirectory + "model";
    string argStr = p.StartInfo.Arguments;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.UseShellExecute = false;
    p.Start();
    tbtrain_result.Text = p.StandardOutput.ReadToEnd();
    p.WaitForExit();
    p.Close();

    // System.Threading.Thread.Sleep(50000); 最好能用多线程来处理
    System.Diagnostics.Process p2 = new System.Diagnostics.Process();
    p2.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_test.exe");//需要启动的程序名
    p2.StartInfo.Arguments = " -m " + TrainDirectory + "model " + TrainDirectory + "test.data";
    p2.StartInfo.RedirectStandardOutput = true;
    p2.StartInfo.UseShellExecute = false;
    p2.Start();
    output = p2.StandardOutput.ReadToEnd();
    TbTest_outputT.Text = output;
    byte[] buffer = Encoding.Default.GetBytes(output);
    File.WriteAllBytes(TrainDirectory + "output.txt", buffer);
    p2.Close();
    sw.Stop();
    TimeSpan ts = sw.Elapsed;
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    TimeSpanL.Text = "用时:" + elapsedTime;
    }

    一些输入输出定义的变量用的时候记得先定义好。

    其实很多不会的知识点,或是一些知识点的细节都是百度到的,记得好的笔记真心让人受益匪浅。最后程序也算是成功的跑起来了,所以,我把学会的东西记下来,一来是可以日后自己复习,二来也可以跟大家一起分享

  • 相关阅读:
    都说程序员钱多空少,程序员真的忙到没时间回信息了吗?
    C/C++知识分享: 函数指针与指针函数,看完这篇你还能不懂?
    C++的那些事儿:从电饭煲到火箭,C++无处不在
    年薪90万程序员不如月入3800公务员?安稳与高收入,到底如何选择?
    【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
    C语言既有高级语言又有低级语言的特点,但为什么它不是低级语言呢?
    【C++学习笔记】看完这篇,C++ 的链接问题不怕你搞不明白!
    既然C++这么难学,为什么还有人“自讨苦吃”?
    编程语言这么多,为什么就只有C 语言能一直得到 SQLite 的青睐?
    初学者疑惑:C语言中,函数反复调用会有什么问题?
  • 原文地址:https://www.cnblogs.com/MiWang/p/4943555.html
Copyright © 2011-2022 走看看