文本文件:逐行读取#
所以,假设我有一个包含20行的文本文件,每行都有不同的文本。 我希望能够有一个包含第一行的字符串,但是当我做NextLine(); 我希望它成为下一行。 我试过这个,但它似乎不起作用:
string CurrentLine; int LastLineNumber; Void NextLine() { System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt"); CurrentLine = file.ReadLine(LastLineNumber + 1); LastLineNumber++; }
我怎么能这样做? 提前致谢。
一般情况下,如果您能够以打开文件的方式设计它,而不是每次都尝试重新打开文件,那会更好。
如果这不切实际,您需要多次调用ReadLine
:
string CurrentLine; int LastLineNumber; void NextLine() { // using will make sure the file is closed using(System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt")) { // Skip lines for (int i=0;i
请注意,这可以通过File.ReadLines
简化:
void NextLine() { var lines = File.ReadLines("C:\\test.txt"); CurrentLine = lines.Skip(LastLineNumber).First(); LastLineNumber++; }
一个简单的电话应该这样做:
var fileLines = System.IO.File.ReadAllLines(fileName);
您需要validation文件是否存在,当然您仍需要查看空行或无效值,但这应该为您提供基础知识。 要循环文件,您可以使用以下内容:
foreach (var singleLine in fileLines) { // process "singleLine" here }
还有一点需要注意 – 您不希望对大文件执行此操作,因为它会处理内存中的所有内容。
好吧,如果你真的不介意每次重新打开文件,你可以使用:
CurrentLine = File.ReadLines("c:\\test.txt").Skip(LastLineNumber).First(); LastLineNumber++;
但是,我建议你使用File.ReadAllLines
或者File.ReadLines(...).ToList()
一次性阅读整个内容。
ReadLine
方法已经读取了StreamReader
的下一行,您不需要计数器或自定义函数。 只需继续阅读,直到达到20行或文件结束。
您不能将行号传递给ReadLine
并期望它找到该特定行。 如果您查看ReadLine
文档 ,您将看到它不接受任何参数。
public override string ReadLine()
处理文件时,必须将它们视为数据流 。 每次打开文件时,都从文件的第一个字节/字符开始。
var reader = new StreamReader("c:\\test.txt"); // Starts at byte/character 0
如果要读取更多行,则必须保持流打开。
using (var reader = new StreamReader("c:\\test.txt")) { string line1 = reader.ReadLine(); string line2 = reader.ReadLine(); string line3 = reader.ReadLine(); // etc.. }
如果你真的想编写一个方法NextLine
,那么你需要将创建的StreamReader
对象存储在某个地方并且每次都使用它。 有点像这样:
public class MyClass : IDisposable { StreamReader reader; public MyClass(string path) { this.reader = new StreamReader(path); } public string NextLine() { return this.reader.ReadLine(); } public void Dispose() { reader.Dispose(); } }
但我建议你循环流:
using (var reader = new StreamReader("c:\\test.txt")) { while (some_condition) { string line = reader.ReadLine(); // Do something } }
或者使用File
类ReadAllLines
方法一次获取所有行:
string[] lines = System.IO.File.ReadAllLines("c:\\test.txt"); for (int i = 0; i < lines.Length; i++) { string line = lines[i]; // Do something }