C#中的FileStreamStreamReader问题我正在测试类FileStream和StreamReader是如何工作的。通过控制台应用程序。我试图进入一个文件并读取行并将它们打印在控制台上。我已经能够使用while循环来完成它,但我想尝试使用foreach循环。使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.IO;命名空间测试{publicclassProgram{publicstaticvoidMain(string[]args){stringfile=@"C:TempNewFolderNewTextDocument.txt";using(FileStreamfs=newFileStream(file,FileMode.Open,FileAccess.Read)){using(StreamReadersr=newStreamReader(fs)){foreach(文件中的字符串行){控制台。写线(线);}}}}}}我一直犯的错误是:无法将“char”类型转换为“string”.WriteLine(线);我可能忽略了一些非常基本的东西,但我看不到它。读取NewTextDocument.txt中的所有行:使用System;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.IO;命名空间测试{publicclassProgram{publicstaticvoidMain(string[]args){stringfile=@"C:TempNewFolderNewTextDocument.txt";使用(FileStreamfs=newFileStream(文件,FileMode.Open,FileAccess.Read)){使用(StreamReadersr=newStreamReader(fs)){while(!sr.EndOfStream){Console.WriteLine(sr.ReadLine());如果您想通过foreach逐行读取文件(以可重用的方式),请考虑以下迭代器块:publicstaticIEnumerableReadLines(stringpath){using(StreamReaderreader=File.OpenText(path)){字符串行;while((line=reader.ReadLine())!=null){yieldreturnline;}}}请注意,这是惰性评估-没有与File.ReadAllLines()关联的缓冲。foreach语法将确保迭代器是Dispose()d,即使出现异常,也会关闭文件:foreach(stringlineinReadLines(file)){Console.WriteLine(line);(这一点只是为了好玩...)这种抽象的另一个优点是它与LINQ配合得很好——即使用这种方法很容易进行转换/过滤等:DateTimeminDate=newDateTime(2000,1,1);varquery=fromlineinReadLines(file)lettokens=line.Split('t')letperson=new{Forname=tokens[0],Surname=tokens[1],DoB=DateTime.Parse(tokens[2])}其中person.DoB>=minDate选择人员;foreach(varpersoninquery){Console.WriteLine("{0},{1}:born{2}",person.Surname,person.Forname,person.DoB);同样,每个人都是懒惰的Evaluatelazily(withoutbuffering)。我的MiscUtil项目中有一个LineReader类。它比这里给出的解决方案稍微好一点,主要是在你如何构建它方面:类“拥有”它使用的任何资源,并适当地关闭它们。但是,它是IDisposable而无需实现IDisposable本身。这就是为什么它需要Func和Func而不是直接使用stream或reader-它需要能够延迟打开直到它需要它。关闭资源的是迭代器本身(由foreach循环自动处理)。正如Marc所指出的,这在LINQ中非常有效。我想举的一个例子是:varerrors=fromfileinDirectory.GetFiles(logDirectory,"*.log")fromlineinnewLineReader(file)selectnewLogEntry(line)intoentrywhereentry.Severity==Severity.错误选择条目;这将从打开和关闭的大型日志文件中流式传输所有错误。结合PushLINQ,您可以做各种好事:)这不是一个特别“棘手”的类,但它确实很方便。如果您不想下载MiscUtil,这里是完整的源代码,为方便起见。源代码的许可证在这里。使用系统;使用系统集合;使用System.Collections.Generic;使用System.IO;使用系统文本;namespaceMiscUtil.IO{//////逐行读取数据源。源可以是文件、流、///或文本阅读器。在任何情况下,源仅在获取///枚举器时打开,并在处置迭代器时关闭。///publicsealedclassLineReader:IEnumerable{//////创建要读取的TextReader的方法。///只读Func数据源;//////从流源创建一个LineReader。只有在获取枚举器时///才会调用委托。UTF-8用于将///流解码为文本。//////数据源publicLineReader(FuncstreamSource):this(streamSource,Encoding.UTF8){}//////从流源创建一个LineReader。只有在获取枚举器时///才会调用委托。//////数据源///用于将流解码///为文本的编码publicLineReader(FuncstreamSource,Encodingencoding):this(()=>newStreamReader(streamSource(),encoding)){}//////从文件名创建一个LineReader。该文件仅在获取枚举器时打开///(或什至检查是否存在)。///UTF8用于将文件解码为文本。//////从文件中读取的文件publicLineReader(stringfilename):this(filename,Encoding.UTF8){}//////从文件名创建一个LineReader。该文件仅在获取枚举器时打开///(或什至检查是否存在)。//////要从中读取的文件///用于将文件解码///为文本的编码publicLineReader(stringfilename,Encodingencoding):this(()=>newStreamReader(filename,encoding)){}//////从TextReader源创建一个LineReader。委托///仅在获取枚举器时调用//////数据源publicLineReader(FuncdataSource){this.dataSource=dataSource;}//////枚举数据sou逐行rce。///publicIEnumeratorGetEnumerator(){使用(TextReaderreader=dataSource()){stringline;while((line=reader.ReadLine())!=null){yieldreturnline;}}}//////逐行枚举数据源。///IEnumeratorIEnumerable.GetEnumerator(){返回GetEnumerator();}}}问题是:foreach(stringlineinfile){Console.WriteLine(line);因为“file”是一个字符串,string实现了IEnumerable但这个枚举器返回“char”,而“char”不能隐式转换为字符串。你应该使用while循环。下面是更优雅的...收益回报读者。读线();}}}看起来像我的作业;)您正在遍历文件名(一个字符串)本身,它一次给您一个字符。只需使用正确使用sr.ReadLine()的while方法即可。您可以简单地使用File.ReadAllLines并尝试在String文件变量中查找行,而不是使用StreamReader。字符串[]行=File.ReadAllLines(文件);foreach(字符串一行一行)Console.WriteLine(行);您正在枚举一个字符串,当您这样做时,您会得到一个字符串。你确定这是你想要的吗?foreach(stringlineinfile)一种简单(非内存高效)遍历文件中每一行的方法是foreach(stringlineinFile.ReadAllLines(file)){..}我想你想要这样的东西:以上就是C#学习教程:C#中的FileStreamStreamReader问题分享的全部内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——using(FileStreamfileStream=newFileStream(file,FileMode.Open,FileAccess.Read)){使用(StreamReaderstreamReader=newStreamReader(fileStream)){stringline="";while(null!=(line=streamReader.ReadLine())){Console.WriteLine(line);}}}本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
