【问题标题】:New line after foreach loopforeach 循环后的新行
【发布时间】:2021-01-06 22:50:23
【问题描述】:

这段代码可以正常工作

foreach (char c in partToDecode)
{
    var sum = c - 48;
    if (sum > 40)
    {
        sum = sum - 8;
    }

    string suma = Convert.ToString(sum, 2).PadLeft(6, '0');
    File.AppendAllText(@"C:\Users\jakub\Pulpit\binary.txt", suma);
}

我们在不可见的 for i 循环内(我的意思是 foreach 和这个换行符在名为 I 的 for 循环内)所以我需要在 foreach 循环之后在 for 循环中换行。 这段代码没有像我希望的那样工作,我在开头有一个新行,在第二行是一个纯文本,希望在 foreach 循环每次完成后都有一个新行

        string sumaaa = Convert.ToString(sum, 2).PadLeft(6, '0');
        File.AppendAllText(@"C:\Users\jakub\Pulpit\binary.txt", sumaaa);
    }

    FileStream stream = new FileStream(@"C:\Users\jakub\Pulpit\binary.txt", FileMode.Open);
    StreamWriter sw = new StreamWriter(stream);
    sw.Write("\n");
    sw.Close();
}

这有点小,之后我有一个代码用于拆分位以将其小部分转换为十进制。它早些时候工作,但我将它插入评论中,现在它什么也没写。这个循环毕竟是独立的,点击确定后运行,然后我有一个始终显示的 form2,没有错误。

for (var k = 0; k < binlines.Count(); k++)
{       
    var binline = binlines[k];
    if (binline != null) //in case it was an empty line error (it's not)
    { 
        string partmessage = binline.Substring(0, 6);
        string partdecoded = Convert.ToInt32(partmessage, 2).ToString();
        string partmessage2 = binline.Substring(6, 2);
        string partdecoded2 = Convert.ToInt32(partmessage2, 2).ToString();
        string partmessage3 = binline.Substring(8, 30);
        string partdecoded3 = Convert.ToInt32(partmessage3, 2).ToString();
        string so on to 15
        File.AppendAllText(@"C:\Users\jakub\Pulpit\decimal.txt", partdecoded + "," + partdecoded2 + "," partdecoded3 + "," + partdecoded4...)
    }
    else
    {
    }

现在我有一个超出范围的异常“索引和长度必须引用字符串中的位置”

【问题讨论】:

  • 什么是“invisible for i loop”?
  • @Charlieface:在帖子中澄清,只是上面没有闭环
  • File.AppendAllText(@"C:\Users\jakub\Pulpit\binary.txt", suma + Environment.NewLine);?
  • 如果你显示你想要的实际格式,你得到的格式(当它几乎可以工作时)以及产生该格式的代码,也许会有所帮助
  • @StriplingWarrior:你的意思是在 foreach 循环中?它将在每个 char 转换为二进制后添加一个新行。我需要在每个 partToDecode 变量之后换行(它是循环的)

标签: c# loops newline


【解决方案1】:

我建议不要一开始就使用 csv 格式,而是将本机二进制数据写入磁盘。在这种情况下,您只需使用 BinaryReader 和 BinaryWriter 即可。

另外,可能值得制作一些治疗方法或一个可以处理将二进制数据读取到 int 的类。

给定

public struct BinReader
{
   private readonly string _line;
   private int _index;
   public BinReader(string line)
   {
      _line = line;
      _index = 0;
   }
   public int GetInt(int length)
   {
      var result = Convert.ToInt32(_line.Substring(_index, length), 2);
      _index += length;
      return result;
   }
}

用法

// some test data
var binLines = new List<string>()
{
   Convert.ToString(1, 2) + Convert.ToString(2, 2) + Convert.ToString(3, 2) + Convert.ToString(4, 2) + Convert.ToString(5, 2),
   Convert.ToString(1, 2) + Convert.ToString(2, 2) + Convert.ToString(3, 2) + Convert.ToString(4, 2) + Convert.ToString(5, 2),
};


// write to file
using (var sw = new BinaryWriter(new FileStream("SomeFileName.dat", FileMode.Create, FileAccess.ReadWrite)))
{
   foreach (var reader in binLines.Select(line => new BinReader(line)))
   {
      sw.Write(reader.GetInt(1));
      sw.Write(reader.GetInt(2));
      sw.Write(reader.GetInt(2));
      sw.Write(reader.GetInt(3));
      sw.Write(reader.GetInt(3));
   }
}

// read from file
using (var br = new BinaryReader(new FileStream("SomeFileName.dat", FileMode.Open, FileAccess.ReadWrite)))
{
   foreach (var reader in binLines.Select(line => new BinReader(line)))
   {
      Console.WriteLine(br.ReadInt32());
      Console.WriteLine(br.ReadInt32());
      Console.WriteLine(br.ReadInt32());
      Console.WriteLine(br.ReadInt32());
      Console.WriteLine(br.ReadInt32());
   }
}

证明它有效

1
2
3
4
5
1
2
3
4
5

【讨论】:

  • 嗯,有时我不知道它的长度,这完全取决于整理出来的消息。我给你看一个完整的代码pastebin.com/fW2H4nQr 所以第一部分是一个显示对话框动作,然后输入一个带有 !AIVDM1,1,,1,A,actualmessage,6 的 txt
  • @Jacob2396 我明白了。我不确定这个答案对你有多大帮助,无论如何祝你好运
  • 是的,我认为第二部分很有用。你不知道该怎么做才能获得这条新线路吗?得到它是至关重要的。我正在考虑 foreach 循环中的一些循环,但我并不了解所有方法,所以不知道如何做这样的事情。 (可能代替 foreach)StringBuilder sb = ... sb.append(sum); if (parttodecode.count = parttodecode.length) { File.AppendAllText(path, sb.tostring() + "\n") } 你看到做这样的事情的选项了吗?
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 2016-09-28
  • 2021-05-28
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多