それで、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<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つの単純な呼び出しで実行できます。
var fileLines = System.IO.File.ReadAllLines(fileName);
ファイルが存在することを確認し、もちろん空白行や無効な値を監視する必要がありますが、これで基本的な情報が得られます。ファイルをループするには、以下を使用できます。
foreach (var singleLine in fileLines) {
// process "singleLine" here
}
もう1つ注意が必要なのは、メモリ内のすべてを処理するため、大きなファイルではこれを実行したくない場合です。
まあ、もしあなたが本当に毎回ファイルを再び開くことを気にしないなら、あなたは使うことができます:
_CurrentLine = File.ReadLines("c:\\test.txt").Skip(LastLineNumber).First();
LastLineNumber++;
_
ただし、_File.ReadAllLines
_、またはFile.ReadLines(...).ToList()
を使用して、全体を一度に読むことをお勧めします。
ReadLine
メソッドはすでにStreamReader
の次の行を読み取ります。そのため、カウンターやカスタム関数は必要ありません。 20行に達するか、ファイルが終了するまで読んでください。
行番号を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
}