ファイルを使用してデータを保存しBinaryWriter
ました。
今、私はそのファイルから(特定の位置から始まる)データを読みたいと思っていBinaryReader
ます
ファイルへの書き込み中に、ファイルの途中に文字列「BREAK」を追加しました。
C# で0 から 'BREAK' の前まで、および 'BREAK' の後から OF FILE の終わりまでを読み取りたい。私を助けてください。
ファイルを使用してデータを保存しBinaryWriter
ました。
今、私はそのファイルから(特定の位置から始まる)データを読みたいと思っていBinaryReader
ます
ファイルへの書き込み中に、ファイルの途中に文字列「BREAK」を追加しました。
C# で0 から 'BREAK' の前まで、および 'BREAK' の後から OF FILE の終わりまでを読み取りたい。私を助けてください。
BinaryWriter
人間が判読できない形式を記述するために使用されるため、binary . 例、プリミティブ型を書きたい場合は、それらをバイト表現で書くことができます(ブール値のように)
StreamReader
したがって、人間が読めるファイルの書き込み/読み取りには、 /を使用できますStreamWriter
。はるかに簡単です。
以下のスニペットは仕様どおりに機能しますが、アルゴリズムなどを改善したい場合のガイドにすぎません。また、a のみを使用することを強くお勧めしますStreamWriter
。ただし、以下のコードではBinaryWriter
.
namespace _16953330
{
class Program
{
static void Main(string[] args)
{
string input =
@"The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
fox jumps over the lazy dfox jumps over the lazy dBREAK fox jumps over the lazy dfox jumps over the lazy d
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.";
using (var stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
using (var writer = new BinaryWriter(stream)) //why use a BinaryWriter if you're gonna write in a human-readable format?
{
writer.Write(input);
}
}
string firstPart = string.Empty;
string secondPart = string.Empty;
StringBuilder sb = new StringBuilder();
using (var stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
using (var reader = new StreamReader(stream))
{
string line;
while (!string.IsNullOrEmpty(line = reader.ReadLine()))
{
int indexOfBreak = line.IndexOf("BREAK");
if (indexOfBreak == -1)
{
sb.Append(line);
}
else
{
string untilBeforeBREAK = line.Substring(0, indexOfBreak);
sb.Append(untilBeforeBREAK);
//remove the first 2 characters in the file as the BinaryWriter
//writes the length of the bytes should a BinaryReader expect
//(if ever you want to use a binary reader which I don't understand
//because you are reading a HUMAN READABLE file)
firstPart = sb.Remove(0,2).ToString();
sb.Clear();
string breakUpToTheEnd = string.Empty;
sb.Append(line.Substring(indexOfBreak));
sb.Append(reader.ReadToEnd());
secondPart = sb.ToString();
}
}
}
}
Console.WriteLine(firstPart);
Console.WriteLine(Environment.NewLine);
Console.WriteLine(secondPart);
}
}
}
しかし、どうしても使用したい場合はBinaryReader
、BinaryWriter
ここに 1 つの解決策があります。
namespace _16953330
{
class Program
{
static void Main(string[] args)
{
byte[] input = Encoding.ASCII.GetBytes(
@"I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryBREAKWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. "); //just for sampling purposes, considering that what you write is NON-human-readable
using (var stream = new FileStream("somefile.exe", FileMode.OpenOrCreate))
{
using (var writer = new BinaryWriter(stream))
{
writer.Write(input);
}
}
byte[] firstPart = null;
byte[] secondPart = null;
StringBuilder sb = new StringBuilder();
string breaker = "BREAK";
List<byte> byteList = new List<byte>();
using (var stream = new FileStream("somefile.exe", FileMode.OpenOrCreate))
{
using (var reader = new BinaryReader(stream))
{
while (reader.BaseStream.Position != reader.BaseStream.Length)
{
byte currentByte;
currentByte = reader.ReadByte();
if (currentByte == 'B')
{
byteList.Add(currentByte);
for (int i = 1; i < breaker.Length; i++)
{
currentByte = reader.ReadByte();
byteList.Add(currentByte);
//if the succeeding characters match the characters after B in BREAK
if ((char)currentByte == breaker[i] && i > 1)
{
byteList.RemoveAt(byteList.Count - 1);
if (i == breaker.Length - 1)
{
//if the for loop reaches its end and matches all characters in BREAK
//remove B (which was added above) and K (added last)
byteList.RemoveAt(byteList.Count - 1);
byteList.RemoveAt(byteList.Count - 1);
firstPart = byteList.ToArray();
byteList.Clear();
}
}
}
}
else
{
byteList.Add(currentByte);
}
}
secondPart = byteList.ToArray();
}
}
Console.WriteLine(firstPart);
Console.WriteLine(Environment.NewLine);
Console.WriteLine(secondPart);
}
}
}
BinaryReader は、バイト単位または文字単位で読み取ります。すべての文字を読み取って、探している組み合わせを確認する必要があります。「B」が見つかった場合は、次が「R」であるかどうかを確認し、そうであれば次が「E」であるかどうかを確認します。これに利用できる優れたアルゴリズムもあるかもしれません。