2

テキストファイルから1行を読み取り、最初の行に戻る必要があるC#アプリケーションを開発しています。

ファイルサイズが大きすぎる可能性があるため、配列にコピーできません。

このコードを試しました

StreamReader str1 = new StreamReader(@"c:\file1.txt");
StreamReader str2 = new StreamReader(@"c:\file2.txt");

int a, b;
long pos1, pos2;

while (!str1.EndOfStream && !str2.EndOfStream)
{
    pos1 = str1.BaseStream.Position;
    pos2 = str2.BaseStream.Position;

    a = Int32.Parse(str1.ReadLine());
    b = Int32.Parse(str2.ReadLine());
    if (a <= b)
    {
        Console.WriteLine("File1 ---> " + a.ToString());
        str2.BaseStream.Seek(pos2, SeekOrigin.Begin);
    }
    else
    {
        Console.WriteLine("File2 ---> " + b.ToString());
        str1.BaseStream.Seek(pos1, SeekOrigin.Begin);
    }
}

私が見つけたプログラムをデバッグしたときstr1.BaseStream.Positionstr2.BaseStream.Positionすべてのループで同じなので、何も変わりません。

もっと良い方法はありますか?

ありがとう

4

2 に答える 2

8

ReadLines大きなファイルに使用できます。実行は延期され、ファイル全体がメモリに読み込まれないため、次のIEnumerableタイプの行を操作できます。

var lines = File.ReadLines("path");

古い.NETバージョンを使用している場合、以下はReadLines自分でビルドする方法です。

    public IEnumerable<string> ReadLine(string path)
    {
        using (var streamReader = new StreamReader(path))
        {
            string line;
            while((line = streamReader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }
于 2013-03-27T10:05:39.757 に答える
0

私が使用することを好む別の方法。

次のような関数を作成します。

string ReadLine( Stream sr,bool goToNext)
        {            
            if (sr.Position >= sr.Length)
                return string.Empty;            
            char readKey;
            StringBuilder strb = new StringBuilder();
            long position = sr.Position;
            do
            {
                readKey = (char)sr.ReadByte();
                strb.Append(readKey);
            }
            while (readKey != (char)ConsoleKey.Enter && sr.Position<sr.Length);
            if(!goToNext)
            sr.Position = position;
            return strb.ToString();        
        }

次に、その引数のファイルからストリームを作成します

Stream stream = File.Open("C:\\1.txt", FileMode.Open);
于 2013-04-01T10:56:46.330 に答える