none
TextBox如何读取.txt文件? RRS feed

  • 问题

  • TextBox如何读取.txt文件?我看过的书,都是用do..while, ReadLine一行一行地读进去的。怎么这么麻烦?

      private void button1_Click(object sender, EventArgs e)

       {读取“C:\abc\pk.txt”里的文件。}

    如果.txt文件只有一行,怎么办?如果.txt文件有多行,但是TextBox的Multiline设置为False. 这又怎么办?如果.txt文件的编码不是UTF-8,也不是Unicode, 也不是ANSI。 是中文或欧文的编码,又会如何?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年3月25日 14:34

答案

  • 你好!
         这样就可以了,编码方式保持默认就可以处理了:
             private void button1_Click(object sender, EventArgs e)
            {
                StreamReader sr = new StreamReader(@"C:\abc\PK.txt");
                this.textBox1.Text = sr.ReadToEnd();
            }

    周雪峰
    • 已标记为答案 dvdvip 2009年3月27日 4:03
    2009年3月26日 7:32
    版主
  • 没有文件大小的限制啊!
     

    周雪峰
    • 已标记为答案 dvdvip 2009年3月27日 12:48
    2009年3月27日 10:51
    版主
  • 加上Close方法就可以了,我给你写的并不完整,主要突出的是ReadToEnd方法! 
    周雪峰
    • 已标记为答案 dvdvip 2009年3月28日 3:39
    2009年3月27日 13:03
    版主

全部回复

  • 你好!
         这样就可以了,编码方式保持默认就可以处理了:
             private void button1_Click(object sender, EventArgs e)
            {
                StreamReader sr = new StreamReader(@"C:\abc\PK.txt");
                this.textBox1.Text = sr.ReadToEnd();
            }

    周雪峰
    • 已标记为答案 dvdvip 2009年3月27日 4:03
    2009年3月26日 7:32
    版主
  • 多问一下。这个读取的.txt文件,大小有没有限制?4GB这么大,能行吗?





    从流的当前位置到末尾读取流。 

    命名空间:System.IO
    程序集:mscorlib(在 mscorlib.dll 中)

    语法
    Visual Basic(声明) 
    Public Overrides Function ReadToEnd As String
     
    Visual Basic(用法) 
    Dim instance As StreamReader
    Dim returnValue As String

    returnValue = instance.ReadToEnd
     
    C# 
    public override string ReadToEnd ()
     
    C++ 
    public:
    virtual String^ ReadToEnd () override
     
    J# 
    public String ReadToEnd ()
     
    JScript 
    public override function ReadToEnd () : String
     











    返回值
    字符串形式的流的其余部分(从当前位置到末尾)。如果当前位置位于流的末尾,则返回空字符串 ("")。 
    异常
    异常类型 条件 
    OutOfMemoryException
     内存不足,无法为返回的字符串分配缓冲区。 
     
    IOException
     发生 I/O 错误。 
     

    备注
    此方法重写 TextReader.ReadToEnd。

    当需要从流的当前位置到末尾读取所有输入时,ReadToEnd 的性能最佳。如果需要对从流中读取的字符数进行进一步的控制,请使用 Read(Char[],Int32,Int32) 方法重载,它通常可达到更佳的性能。

    ReadToEnd 假定流在到达末尾时会知道已到达末尾。对于交互式协议(服务器仅当被请求时才发送数据而且不关闭连接),ReadToEnd 可能被无限期阻止,应避免出现这种情况。

    请注意,当使用 Read 方法时,使用大小与流的内部缓冲区相同的缓冲区会更有效。如果构造流时未指定缓冲区大小,则缓冲区的默认大小为 4 KB(4096 字节)。


    如果当前方法引发 OutOfMemoryException,则读取器在基础 Stream 对象中的位置会向前移动此方法能够读取的字符数,而已经读入内部 ReadLine 缓冲区中的字符将被丢弃。因为无法更改读取器在流中的位置,所以已经读取的字符是无法恢复的,只能通过重新初始化 StreamReader 对象访问它们。如果流中的初始位置未知,或者流不支持查找,则也需要重新初始化基础 Stream 对象。

    为避免这种情况并生成可靠的代码,应使用 Read 方法并将已读取的字符存储在预先分配的缓冲区内。

    有关使用此方法的示例,请参见“示例”部分。下表列出了其他典型或相关的 I/O 任务的示例。

    若要执行此操作... 
     请参见本主题中的示例... 
     
    创建文本文件。 
     如何:向文件写入文本 
     
    写入文本文件。 
     如何:向文件写入文本 
     
    读取文本文件。 
     如何:从文件读取文本 
     
    向文件中追加文本。 
     如何:打开并追加到日志文件 

    File.AppendText 

    FileInfo.AppendText 
     
    获取文件大小。 
     FileInfo.Length 
     
    获取文件属性。 
     File.GetAttributes 
     
    设置文件属性。 
     File.SetAttributes 
     
    确定文件是否存在。 
     File.Exists 
     
    读取二进制文件。 
     如何:对新建的数据文件进行读取和写入 
     
    写入二进制文件。 
     如何:对新建的数据文件进行读取和写入 
     

    示例
    下面的代码示例在一次操作中一直读到文件的末尾。

    Visual Basic 复制代码 
    Imports System
    Imports System.IO
    Imports System.Text

    Public Class Test

      Public Shared Sub Main()
      Dim path As String = "c:\temp\MyTest.txt"

      Try
      If File.Exists(path) Then
      File.Delete(path)
      End If

      Dim sw As StreamWriter = New StreamWriter(path)
      sw.WriteLine("This")
      sw.WriteLine("is some text")
      sw.WriteLine("to test")
      sw.WriteLine("Reading")
      sw.Close()

      Dim sr As StreamReader = New StreamReader(path)

      'This allows you to do one Read operation.
      Console.WriteLine(sr.ReadToEnd())
      sr.Close()
      Catch e As Exception
      Console.WriteLine("The process failed: {0}", e.ToString())
      End Try
      End Sub
    End Class

     
    C# 复制代码 
    using System;
    using System.IO;

    class Test 
    {
     
      public static void Main() 
      {
      string path = @"c:\temp\MyTest.txt";

      try 
      {
      if (File.Exists(path)) 
      {
      File.Delete(path);
      }

      using (StreamWriter sw = new StreamWriter(path)) 
      {
      sw.WriteLine("This");
      sw.WriteLine("is some text");
      sw.WriteLine("to test");
      sw.WriteLine("Reading");
      }

      using (StreamReader sr = new StreamReader(path)) 
      {
      //This allows you to do one Read operation.
      Console.WriteLine(sr.ReadToEnd());
      }
      } 
      catch (Exception e) 
      {
      Console.WriteLine("The process failed: {0}", e.ToString());
      }
      }
    }


    则缓冲区的默认大小为 4 KB(4096 字节)。这个是什么意思?只能读4KB的文件?还是说,读取时,占用4KB的内存?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年3月27日 9:06
  • 没有文件大小的限制啊!
     

    周雪峰
    • 已标记为答案 dvdvip 2009年3月27日 12:48
    2009年3月27日 10:51
    版主
  • 那么,这个SDK文档,说是什么东西?

    还有,你的


      StreamReader sr = new StreamReader(@"C:\abc\PK.txt");
      this.textBox1.Text = sr.ReadToEnd();

    是不是少了sr.Flush()和sr.Close()这两个方法?我看写入.txt文件里,都要调用这两个方法的。读取时,也要它们吧?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年3月27日 12:51
  • 加上Close方法就可以了,我给你写的并不完整,主要突出的是ReadToEnd方法! 
    周雪峰
    • 已标记为答案 dvdvip 2009年3月28日 3:39
    2009年3月27日 13:03
    版主