【发布时间】:2015-05-19 08:29:20
【问题描述】:
在 C# .NET 4.0(实际上是 4.5.2)中,我的代码读取一个 UTF-8 文件。
FileStream fstream = new FileStream(path, FileMode.Open);
BufferedStream stream = new BufferedStream(fstream);
using (StreamReader reader = new StreamReader(stream, new UTF8Encoding())) {
int i;
while((i = reader.Read()) > -1) {
//a guess at a condition that is true I.F.F. reader has read character 1 of the file
if (stream.Position == (0 + sizeof(char)) || stream.Position == (0 + sizeof(int)) ) {
//while loop has reader read through all characters,
//but within this block, the reader has surely read character 1?
char c = (char)i;
}
}
reader.Close();
return 0;
}
I.F.F.我们达到了 StreamReader 读取 UTF-8 文件的起始字符的条件,然后在读取的第一个字符上运行一些函数。
使用 FileStream 和 StreamReader 读取 UTF-8 文件,如何知道是否满足上述条件?
我正在寻找使用 C# .NET 4.0 System.IO 命名空间中已存在的属性或方法的答案。我认为使用 Stream.Position (BufferedStream.Position) 属性是找出阅读器在文件中的位置(即在什么字符处)的明显方法,但是在尝试以 @ 中的某个字符开头的 UTF-8 文件时987654322@ 到 '9'(48 到 57),带有 reader.Read() 的循环读取该字符,然后 stream.Position = 43 。我不知道为什么在读取第一个字符后所有整数值中的 43 是 stream.Position 的值,或者 43 是什么意思。
更新:随着循环迭代和阅读器读取更多字符,stream.Position 值保持在 43。我不知道 Position 属性是否有用。
【问题讨论】:
-
你想完成什么?现有的代码不是很有启发性。我不明白这是什么意思。
-
将 UTF 文件读入 C#
char或String值。总体问题是根据文件中char的位置和char值执行一些操作。存在预期的格式,因此文件的第nth 行的char值的读取和使用与n + 1或n + 2行不同。n行的ith 字符可能会更改一个字段,而chari + 1会设置另一个字段并在某处更改状态。这有帮助吗? -
好的,你能用 File.ReadAllText/Lines 处理你从中得到的字符串吗?
-
当然,或者使用 StreamReader.ReadToEnd() 的许多其他方法来做到这一点;将
char读入一个巨大的内存块,但这与以缓冲方式读取数据相比会受到批评,比如使用 BufferedStream。 -
对了,这里可以成功使用StreamReader了。另一种方式似乎更容易。一旦您遍历一系列行,解决方案可能很明显。然后可以在普通字符串上完成所有位置计算。我只是想让你知道这件事。也许 xanatos 的回答也能解决问题。