Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言读取自定义加热计划文件#_C# - Fatal编程技术网

C# 用C语言读取自定义加热计划文件#

C# 用C语言读取自定义加热计划文件#,c#,C#,我已经用C语言写了一个算法文件,用于控制一个实验加热系统。为了使其工作,它使用了一个类似于下面保存在文本文件中的时间表(减去不属于该文件的项目符号和标题) 时间|行动 00:00-SP 00:15-SP 00:30-SP 06:00-SP 07:00-CT 13:15-MT 我有一个文件流来逐行读取文件。如下图所示: System.IO.StreamReader file = new System.IO.StreamReader(WsLoc); file.Close(); 将时间与系统时间

我已经用C语言写了一个算法文件,用于控制一个实验加热系统。为了使其工作,它使用了一个类似于下面保存在文本文件中的时间表(减去不属于该文件的项目符号和标题)

时间|行动
  • 00:00-SP
  • 00:15-SP
  • 00:30-SP
  • 06:00-SP
  • 07:00-CT
  • 13:15-MT
我有一个文件流来逐行读取文件。如下图所示:

System.IO.StreamReader file = new System.IO.StreamReader(WsLoc);
file.Close();
将时间与系统时间分开,然后将右侧的操作添加到稍后在if语句中使用的变量中,最简单的方法是什么?下面显示的类似内容是我的目标

Where StreamData = System Time
DtaAction = (from file)

If DtaAction = SP

Else if DtaAction = MT
使用
string.Split()。使用
开关
语句根据变量执行代码。。。大概是这样的:

string[] parts = line.Split('-');
if(parts.Length != 2)
    throw new NotSupportedException();
string time = parts[0].Trim();
var currentTime = DateTime.Now();
string action = parts[1].Trim();
switch(action)
{
    case "SP":
        DoSPAction();
        break;
    case "CT":
        DoCTAction();
        break;
    case "MT":
        DoMTAction();
        break;
    default:
        throw new InvalidArgumentException("unsupported action");
}

使用string.Split和StreamRead.ReadLine获取数据。如果您试图将文件的时间与系统时间进行比较,则可能还需要使用时间跨度公差(这样它就不必匹配到1/10000000秒,这不太可能得到匹配):

var stream=newfilestream(“myfile.txt”,FileMode.Open);
var streamReader=新的streamReader(流);
而(!streamReader.EndOfStream)
{
//读入文件的当前行
var line=streamReader.ReadLine();
if(string.IsNullOrWhiteSpace(行))
继续;
//用连字符分隔行,修剪空白
var split=line.split(new[]{'-'})。选择(x=>x.Trim()).ToArray();
//解析时间,使用当天的当前日期
var time=DateTime.Parse(拆分[0]);
//保存您的操作以备以后使用
var行动=分割[1];
//将文件中的时间与当前时间进行比较,使用1秒公差
if(DateTime.Now.Subtract(time).Duration()

顺便说一句,如果您可以控制文件类型,那么这些数据似乎更适合作为XML。C#拥有大量LINQ to XML函数库,使解析XML比解析文本文件容易得多。

“实验加热系统”-火?火确实是其中的一小部分。。。。指的是一个典型的供暖系统安装,你会发现在商业建筑或家庭。。。。锅炉、管道、散热器等。你的意思是HH:mm(小时:分钟)?如果是这样,我认为默认情况下解析方法应该使用该格式(假设您的Thread.CurrentCulture是en-US或任何其他使用类似日期时间格式的区域性)。如果出现解析错误,可以使用DateTime.ParseExact,它可以指定正在解析的字符串的格式。哦,好吧,我想知道,因为当我试图在屏幕上写一行来指定正在进行的操作时。它为整个计划编写,而不是为特定时间编写。听起来像是“if”语句的问题,在该语句中,您将解析的时间与系统时间进行比较。如果你用你正在使用的代码和正在发生的事情的描述来更新你的问题,我们可能会进一步提供帮助。我在我的提交中发现了这个bug。我们需要使用Duration()方法来获取TimeSpan的绝对值。我已经更新了我的提交,除了我自己犯了一个愚蠢的错误,还有一个空的时间表文件。它工作得非常出色。谢谢你的帮助!:)
var stream = new FileStream("myfile.txt", FileMode.Open);
var streamReader = new StreamReader(stream);
while (!streamReader.EndOfStream)
{
   // read in the current line of the file
   var line = streamReader.ReadLine();
   if (string.IsNullOrWhiteSpace(line))
        continue;

   // split the line by the hyphen, trim the whitespace
   var split = line.Split(new[] { '-' }).Select(x => x.Trim()).ToArray();

   // parse the time, use the current date for the day
   var time = DateTime.Parse(split[0]);

   // save your action for later
   var action = split[1];

   // compare the time in the file with the current time, use a 1 second tolerance
   if (DateTime.Now.Subtract(time).Duration() < TimeSpan.FromSeconds(1))
   {
        // if the current time is within 1 second of the time in the file
        switch(action)
        {
             case "SP":
                break;
             default:
                break;
        }
   }
}