所以,假设我有一个包含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++;
}
我怎么能这样做? 提前谢谢。
答案 0 :(得分:10)
通常情况下,如果您能够以打开文件的方式设计它,而不是每次都尝试重新打开文件,那会更好。
如果这不切实际,您需要多次致电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<LastLineNumber;++i)
file.ReadLine();
// Store your line
CurrentLine = file.ReadLine();
LastLineNumber++;
}
}
请注意,这可以通过File.ReadLines
简化:
void NextLine()
{
var lines = File.ReadLines("C:\\test.txt");
CurrentLine = lines.Skip(LastLineNumber).First();
LastLineNumber++;
}
答案 1 :(得分:4)
一个简单的电话应该这样做:
var fileLines = System.IO.File.ReadAllLines(fileName);
您需要验证文件是否存在,当然您仍然需要查看空行或无效值,但这应该为您提供基础知识。要循环文件,您可以使用以下内容:
foreach (var singleLine in fileLines) {
// process "singleLine" here
}
还有一点需要注意 - 您不希望对大文件执行此操作,因为它会处理内存中的所有内容。
答案 2 :(得分:3)
好吧,如果你真的不介意每次重新打开文件,你可以使用:
CurrentLine = File.ReadLines("c:\\test.txt").Skip(LastLineNumber).First();
LastLineNumber++;
但是,我建议您使用File.ReadAllLines
或File.ReadLines(...).ToList()
一次性阅读整篇文章。
答案 3 :(得分:2)
ReadLine
方法已经读取StreamReader
中的下一行,您不需要计数器或自定义函数。只需继续阅读,直到达到20行或文件结束为止。
答案 4 :(得分:1)
您无法将行号传递给ReadLine
,并希望它能找到该特定行。如果您查看ReadLine
documentation,您会看到它不接受任何参数。
public override string ReadLine()
使用文件时,必须将它们视为 streams 数据。每次打开文件时,都从文件的第一个字节/字符处开始。
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
method:
string[] lines = System.IO.File.ReadAllLines("c:\\test.txt");
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i];
// Do something
}