`
ihuashao
  • 浏览: 4547309 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

(StreamReader.ReadLine()==null)还是(-1 != StreamReader.Peek())?

阅读更多

有人问到一个问题:

一个文本里有多行,如:
geafd1
bragd2
beree3
beaee4
dfefa/
fdasf5
feafd/
..
..
怎么把结尾是“/”的行删掉?

其实,解决思路很简单,将文本逐行读取到数组中,再遍历数组判断即可。于是,某个项目中常用方法:

方法一:

这也是微软提供的示例,在实际使用中发现,有时候,该方法的缺陷在于不能读取完整地读取文件所有行。怀疑是缓冲区过小。查MSDN说明:

StringReader . ReadLine 方法将行定义为后面跟有下列符号的字符序列:换行符(“\n”)、回车符(“\r”)或后跟换行符的回车符(“\r\n”)。 所产生的字符串不包含终止回车符和/或换行符。 如果已到达基础字符串的结尾,则返回值为 null
http://msdn.microsoft.com/zh-cn/library/system.io.streamreader.readline.aspx

我的理解:如果由于编码的问题,导致读取异常,也就是无法读取行标志时,可能会认为已到文件结尾而中断下行的读取。这也解释了为什么会有时读取不完整的原因。


如何避免这个问题呢?可以使用方法二:

方法二:

这里使用 StreamReader的Peek()方法,依据MSDN的说明,

Peek 方法返回一个整数值以便确定是否到达文件末尾,或发生其他错误。 这样一来,用户在将返回值强制转换为 Char 类型之前就可以首先检查该值是否为 -1。

换句话说,它不需要先转换字符,即可返回是否达到文件末尾。

http://msdn.microsoft.com/zh-cn/library/system.io.streamreader.peek.aspx

其实还可以用第三种方法: File ReadAllLines 方法 (String)

方法三:


MSDN说明:

此方法打开一个文件,读取文件的每一行,然后将每一行添加为字符串数组的一个元素。 然后它关闭文件。 根据定义,一行就是一个后面跟有下列符号的字符序列:回车符(“\r”)、换行符(“\n”)或回车符后紧跟一个换行符。 所产生的字符串不包含终止回车符和/或换行符。

此方法尝试根据现存的字节顺序标记来自动检测文件的编码。 可检测到编码格式 UTF-8 和 UTF-32(包括 big-endian 和 little-endian)。

http://msdn.microsoft.com/zh-cn/library/s2tte0y1.aspx

方法三也可能存在与方法一类似的缺陷。

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn

      

分享到:
评论

相关推荐

    淘宝数据抓取 初学者适用

    //获取页面 private string CreateRequest(string strURL) { ... using (var newStream = new StreamReader(stream, Encoding.GetEncoding("GBK"))) { return newStream.ReadToEnd(); } } }

    在VB.NET 读取TXT文件内容按行

    Dim sr As System.IO.StreamReader = New System.IO.StreamReader(Application.StartupPath & "\tmp.Txt", System.Text.Encoding.Default) Dim line As String line = sr.ReadLine Me.ToolStripStatusLabel2.Text...

    联通短信通平台C#范例

    联通短信通平台C#范例 public static string ... StreamReader sr = new StreamReader(myStream, Encoding.GetEncoding(strEcode)); String strContent = sr.ReadToEnd(); sr.Close(); return strContent; }

    教务网成绩查询工具(C#发送HTTP请求)

    request.Proxy = null;//不使用代理 request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, ...

    c#拼图游戏

    public partial class Form1 : Form { #region 全局变量 Image im; Bitmap bm; Bitmap empt; ArrayList arrrect = new ArrayList(); //ArrayList emptpt = new ArrayList(); ArrayList arrpic = new ...

    基于Window mobile 6 程序设计——文本编辑器

    StreamReader din = File.OpenText(OpenFile.FileName); String str; while ((str=din.ReadLine())!=null) { textBox1.Text = textBox1.Text + str + "\r\n"; } din.Close(); this.Text = Path.GetFileName...

    使用ffmpeg.exe获取文件属性信息,视频音频时长

    System.IO.StreamReader errorreader = pro.StandardError; pro.WaitForExit(1000); string result = errorreader.ReadToEnd(); if (!string.IsNullOrEmpty(result)) { result = result.Substring(result....

    API精灵源码(C#编)

    this.button1.Click += new System.EventHandler(this.button1_Click); // // groupBox1 // this.groupBox1.Controls.Add(this.tiplist); this.groupBox1.Controls.Add(this.select_type); ...

    网页内容变动简易监视器

    System.IO.StreamReader sr = new System.IO.StreamReader(responseStream, Encoding.UTF8); string content_start = sr.ReadToEnd(); textBox1.Text = content_start; tb_time.Text =tb_time .Text .Trim(); ...

    。NET经典技术

     StreamReader sr = new StreamReader(str,System.Text.Encoding.Default);  string t = sr.ReadToEnd();  this.Response.Write(t.ToString()); 11.获取" . "后面的字符  i.ToString().Trim().Substring(i....

    TrafficControl.js

    1、修改源文件TrafficControl.js 2、//使百度地图交通状况支持https后台方法:  [HttpGet]  public void GetTrafficContol()  {  HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)...

    自我更新模块

    System.IO.StreamReader a = new System.IO.StreamReader("upgrade.list"); bool up = true; string upfile = a.ReadLine(); while (up) { upfile = a.ReadLine(); if (upfile == null) up = false; else ...

    txt文件写入读取.txt

    private void inputdata_Click(object sender, EventArgs e) ... StreamReader sr = File.OpenText (path1); string s = ""; while ((s = sr.ReadLine()) != null) { textBox1.Text = s; } sr.Close();

    C#.net TCP通讯

    ClientReader = new StreamReader(Stream); ClientWriter = new StreamWriter(Stream); txtServerIp.Enabled = false; btnConnect.Enabled = false; this.Text = "客户端 " + "正在与" + txtServerIp.Text.Trim...

    在线报名系统 net

    StreamReader sr = new StreamReader(indexDirectory, true); string strStart = sr.ReadLine(); string strEnd = sr.ReadLine(); sr.Close(); DateTime dtStart = DateTime.Parse(strStart); DateTime dtEnd ...

    FTP服务器 C#

    receiveString = user.commandSession.streamReader.ReadLine(); } catch(Exception ex) { if (user.commandSession.tcpClient.Connected == false) { AddInfo(string.Format("客户端({0}断开连接!)", user....

    C# for CSDN 乱七八糟的看不懂

    数组长度 line0.GetLength(1) 数组赋值 可以从一个已经赋值的数组 array2 向未赋值的同等数组 array1 赋值,用 array1=array2; 这时,array1 就变成和 array2 一样的数组了。 集合 集合的使用 集合可以看成是可以...

    C# 记事本代码

    StreamReader sr = new StreamReader(openFile.FileName); inputInfo.Text = sr.ReadToEnd(); sr.Close(); FileInfo fileInfo = new FileInfo(openFile.FileName); // 把标题改为打开的文件的名称 Text = "*" ...

    基于c#CP3平面网严密平差数据处理

    SV[i] = -( X[4]+BS[i, 3] * X[5])+BS[i, 0] * X[1] + BS[i, 1] * X[2] + BS[i, 2] * X[3] - lS[i]; } } public void Cal_SV(double[] SV, double[,] BS, double[] lS, double[] X, int n) { for (int i = 0; ...

    远程数据交互.txt

    str1=string.Concat(str1, str); } readStream.Close(); myReq.Abort(); return str1; } // private string EncryptMD5(string sOridinal) // { // string sEncrypt = ""; // sEncrypt...

Global site tag (gtag.js) - Google Analytics