【问题标题】:Problems reading a textfile where I skip 1 line and place it into a char array读取文本文件时出现问题,我跳过 1 行并将其放入 char 数组
【发布时间】:2017-04-03 16:40:49
【问题描述】:

我在读取文本文件时遇到问题,我跳过了第一行,然后将其放入 char 数组中。

如果我想将它放入一个类似于下面代码的数组中,操作非常简单,但它应该是一个字符数组。

var content = File.ReadAllLines("Labyrint.txt");
File.WriteAllLines("Labyrint.txt", content.Skip(1).ToArray());

【问题讨论】:

  • 您面临的问题是什么?此外,您提供的代码中没有字符数组
  • 您是否只想将除跳过的行之外的所有行写在一行中吗?
  • C# 中的char[] 用途相对较少。你的意思是你想把所有的行都放在一个string 中吗?你将如何使用它?
  • 文本文件是一个迷宫,我将它放在一个 char 数组中,因为我想确切地知道数组中哪些索引是墙(包含字符的索引)以及用户的路径可以继续前进(空索引)。

标签: c# arrays text char skip


【解决方案1】:

我确实找到了一种让它工作的方法,但问题是它只能在第一次工作。原因是程序第一次启动时会删除文件中的第一行。但是,文件保存时删除了第一行。所以下次程序启动时,它将删除新的第一行,依此类推,直到文本文件中没有更多行。

//Delete the first line in the textfile
var Labo = File.ReadAllLines("Labyrint.txt");
File.WriteAllLines("Labyrint.txt", Labo.Skip(1).ToArray());
//import the textfile after the first line has been deleted
        string content = File.ReadAllText("Labyrint.txt", Encoding.UTF8);

        // Use ToCharArray to convert string to array.
        char[] array = content.ToCharArray();

【讨论】:

    【解决方案2】:

    为此,您必须使用像这样的流阅读器手动读取所有行

    编辑 更正了 Peek Systax

    StringBuilder sb = new StringBuilder();
    using(StreamReader sr = new StreamReader("Labyrint.txt")){
        sr.ReadLine(); //skip first Line
        while(sr.Peek()!=-1){
            sb.AppendLine(sr.ReadLine());
        }
    }
    char[] content = sb.ToString().ToCharArray();
    
    File.WriteAllText("Labyrint.txt",sb.ToString());
    

    【讨论】:

    • 感谢您的回复,但是我在“peek”一词下得到一条红线,表示“StreamReader 不包含 peek 的定义,并且找不到接受 StreamReader 类型的第一个参数的扩展方法(您是否缺少 using 指令或程序集引用)。我看不到我缺少什么 using 指令。我都有系统和系统 IO?顺便说一下,您能否解释一下每一行代码,以便清楚地知道它是什么是的。
    • 感谢 MrZander 帮助使代码工作。但是,它与我提出的解决方案具有完全相同的问题。代码第一次运行时它工作正常,它会删除第一行,但下次我启动程序时,它将删除下一个第一行。这意味着每次程序运行时都会删除一行并随后保存文件?我希望它导入文件并删除第一行,但不保存删除行的文件。我该怎么做?
    【解决方案3】:

    好吧,经过 1 天的挫折和不同的方法后,我终于找到了解决方案。除了找到解决方案之外,我还设法使代码非常简单,所以这是美好的一天。你们在下面找到正确的解决方案:

    using System;
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
    using System.IO;
    
    using System.Threading.Tasks;
    
    namespace ConsoleApplication25
    
    {
    class Program
    {
    
        static char[] values;
        static void Main(string[] args)
        {
            //Increase Console Buffer Height
            Console.BufferHeight = Int16.MaxValue - 1;
    
            foreach (var line in File.ReadAllLines("Labyrint.txt", Encoding.UTF8).Skip(1))
            {
                values = line.ToCharArray();
    
                Console.WriteLine(values);
    
            }
    
            //finds the character on index 0
            Console.WriteLine(values[0]);
    
            }
        }
    }
    

    【讨论】:

    • 好吧,我太快了,不敢恭维自己,因为如果您尝试获取 56 的索引而不是 0,则会引发异常。如果你在 foreach 循环之外说 Console.WriteLine(values),它只会在输出窗口中显示最后一行。任何知道如何将 foreach 循环的最终结果保存在字符串变量中的人,而不是现在只保存最后一行? ——
    【解决方案4】:

    我想知道我是唯一一个关注这个帖子的人,还是人们只是不知道该怎么做? 无论如何,我想出了一个现在几乎可以工作的解决方案。这意味着文本文件中的第一行被跳过,然后在 stringbuilder 的帮助下放置在一个 char 数组中。然而,并非一切都是完美的,因为当我通过索引号查找元素时,它们与它们应该在的位置相差 2 个位置。 Forinstens 字符 B 应该在索引 21,但由于某种原因它在索引 23?我检查了文本文件,文本文件中的任何行之后都没有空格,并且构建器没有修剪方法,所以有人有什么建议吗?你们在下面找到我的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading.Tasks;
    
    
    namespace ConsoleApplication25
    {
    
    
    
     class Program
    {
    
        static char[] FloridaArray;
        static string DenverString;
    
        static void Main(string[] args)
        {
            //Increase Console Buffer Height
            Console.BufferHeight = Int16.MaxValue - 1;
    
            DenverString = ConvertStringArrayToString();
            FloridaArray = DenverString.ToArray();
            Console.WriteLine(DenverString);
            Console.WriteLine(FloridaArray[43]);
        }
    
        static string ConvertStringArrayToString()
        {
            // Concatenate all the elements into a StringBuilder.
            StringBuilder builder = new StringBuilder();
            foreach (var value in File.ReadAllLines("Labyrint.txt", Encoding.UTF8).Skip(1))
            {
    
                builder.Append(value);
                builder.AppendLine();
            }
    
            return builder.ToString();
    
        }
    }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多