我正在尝试阅读文本文件的某个部分。该文字如下所示:
[HRZones]
195
175
156
0
[SwapTimes]
[Trip]
474
0
6616
-223
[HRData]
84 182 87 -222 129 4139
84 182 87 -222 129 4139
88 179 86 -222 133 3640
95 185 92 -222 136 3393
103 193 91 -222 123 4666
107 196 94 -222 125 5684
107 198 96 -222 128 4919
109 197 95 -222 131 4926
110 198 96 -222 134 4655
111 196 95 -222 126 4154
该文件实际上在[HRData]部分下包含更多行。
我正在尝试使用以下代码获取[HRData}。可悲的是,这锁定了程序;断点显示这发生在第一个while循环中..几乎就像它看不到任何东西?
private void readFile()
{
//read the hrm file and split values
try
{
using (StreamReader sr = new StreamReader(file_name))
{
string line;
while ((line = sr.ReadLine()) != "[HRData]")
{
line = sr.ReadLine(); // FAILS HERE..
}
while((line = sr.ReadLine()) != null)
{
string split = line;
string[] values = split.Split('\t');
foreach (String value in values)
{
hrdata[i, j] = int.Parse(value);
i++;
if (i > 5)
{
i = 0;
j++;
}
}
}
}
}
正在从先前的检查传递file_name,数据似乎很好。
答案 0 :(得分:2)
在这里,您检查一行并跳过下一个。避免第二次ReadLine
。
while ((line = sr.ReadLine()) != "[HRData]")
{
line = sr.ReadLine(); // FAILS HERE..
}
答案 1 :(得分:1)
检查EOF和Trim()它以使文本相等起作用。以下应该工作
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
if (!string.IsNullOrWhiteSpace(line) && line.Trim() == "[HRData]")
{
break;
}
}
while (!sr.EndOfStream)
{
string split = sr.ReadLine();
string[] values = split.Split('\t');
foreach (String value in values)
{
hrdata[i, j] = int.Parse(value);
i++;
if (i > 5)
{
i = 0;
j++;
}
}
}
答案 2 :(得分:1)
正如一些人已经指出的那样,你在循环条件下读取一条线,然后又在循环体中读取一条线,这样这可能会起作用或失败,这取决于[HRData]
是出现在奇数还是偶数上文件的行。
将while
循环重写为for
,而不是:
for (var line = sr.ReadLine();
line != null && line != "[HRData]");
line = sr.ReadLine()) { /* NOP */ }
如果你有能力使用LINQ,那么以下更简单,不需要任何脑力体操:
foreach (var line in File.ReadLines().SkipWhile(s => s != "[HRData]")) {
// ...
}
答案 3 :(得分:0)
使用该循环,您可能会跳过包含搜索文本的行,因为您读了两行但只测试了一次
string line = sr.ReadLine();
while (line != null && line != "[HRData]")
{
line = sr.ReadLine();
}
如果文件恰好在循环之前有一行,那么它可能会有效,但错误仍然存在
答案 4 :(得分:0)
我注意到的两件事:
1)您有否检查[HRData]
“代码”。检查不是标记的行而不是null。
2)我认为你的循环作为一个整体不知道在文件的末尾停止阅读。