StreamReader не читает весь мой файл?
Постановили:
Файл на SD-карте содержит группу пустых значений в этой точке файла.
Я использую Netduino Plus для чтения текста из файла на SD-карте. Я использую C# .NET Micro Framework 4.2 и FileReader / StreamReader, чтобы сделать это. Я прочитал буфер StreamReader длиной 512 байт. Вы можете прочитать только 512 байт данных с StreamReader и все? Вот почему мне интересно и описание моей проблемы...
Вот пример файла, который я читаю...
40
3,241,17,17,1000,2000
3,14,92,223,1000,2000
3,101,229,12,1000,2000
3,16,215,228,1000,2000
3,50,240,11,1000,2000
3,232,213,10,1000,2000
3,234,219,219,1000,2000
3,202,13,222,1000,2000
3,240,5,65,1000,2000
3,25,234,3,1000,2000
3,236,5,164,1000,2000
3,26,229,12,1000,2000
3,225,217,18,1000,2000
3,8,229,216,1000,2000
3,49,0,7,1000,2000
3,12,99,190,1000,2000
3,222,7,226,1000,2000
3,12,221,208,1000,2000
3,4,37,227,1000,2000
3,4,122,48,1000,2000
3,88,181,192,1000,2000
3,1,17,222,1000,2000
3,56,235,19,1000,2000
3,236,15,101,1000,2000
3,13,175,231,1000,2000
3,229,218,17,1000,2000
3,9,74,239,1000,2000
3,10,233,17,1000,2000
3,12,73,227,1000,2000
3,234,3,3,1000,2000
3,7,128,110,1000,2000
3,5,209,241,1000,2000
3,8,61,229,1000,2000
3,237,1,238,1000,2000
3,228,19,19,1000,2000
3,16,228,92,1000,2000
3,243,206,14,1000,2000
3,193,3,220,1000,2000
3,236,7,7,1000,2000
3,115,236,7,1000,2000
-Первая строка указывает, сколько строк следовать. -Первое число в следующих строках указывает, сколько элементов данных будет считано из строки. (в этом примере в каждой строке 3 элемента данных). Последние два числа в строке - это время в мс.
Мой код читает большую часть файла и останавливается.
40
3,241,17,17,1000,2000
3,14,92,223,1000,2000
3,101,229,12,1000,2000
3,16,215,228,1000,2000
3,50,240,11,1000,2000
3,232,213,10,1000,2000
3,234,219,219,1000,2000
3,202,13,222,1000,2000
3,240,5,65,1000,2000
3,25,234,3,1000,2000
3,236,5,164,1000,2000
3,26,229,12,1000,2000
3,225,217,18,1000,2000
3,8,229,216,1000,2000
3,49,0,7,1000,2000
3,12,99,190,1000,2000
3,222,7,226,1000,2000
3,12,221,208,1000,2000
3,4,37,227,1000,2000
3,4,122,48,1000,2000
3,88,181,192,1000,2000
3,1,17,222,1000,2000
3,56,235,19,1000,2000
3,236,15,101,1000,2000
3,13,175,231,1000,2000
3,229,218,17,1000,2000
3,9,74,239,1000,2000
3,10,233,17
other lines are not read
Он пропускает два значения времени в этом вызове readline, и код выделяется при назначении time2 в приведенном ниже коде для System.IndexOutOfRangeException, поскольку линейная длина составляет 5 элементов (значение null не преобразуется в int lol) и выглядит лайк....
linearray[0] = "3"
linearray[1] = "10"
linearray[2] = "233"
linearray[3] = "17"
linearray[4] = ""
вместо того, чтобы быть 6 элементов длиной, как остальные линии и выглядеть как....
linearray[0] = "3"
linearray[1] = "10"
linearray[2] = "233"
linearray[3] = "17"
linearray[4] = "1000"
linearray[5] = "2000"
Все предыдущие строки читаются нормально, и линейный массив содержит все данные, которые он должен. Я не использую StreamReader правильно?
Вот код....
FileStream fs2 = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.None);
StreamReader sr = new StreamReader(fs2);
line = sr.ReadLine();
numLines = Convert.ToInt32(line);
line = "";
for (int i = 0; i < numLines; i++)
{
line = sr.ReadLine();
string[] linearray = line.Split(comma);
numDataElements[i] = int.Parse(linearray[0]);
for (int j = 1; j <= numDataElements[i]; j++)
{
readData[i][j] = byte.Parse(linearray[j]);
}
//clear the rest of the channels
for (int j = (numDataElements[i]+1); j <= MAXCHANNELS; j++)
{
data[i][j] = (byte)0;
}
time1[i] = Convert.ToInt32(linearray[linearray.Length - 2]);
time2[i] = Convert.ToInt32(linearray[linearray.Length - 1]);
}
Спасибо!
1 ответ
Просто чтобы ответить на этот вопрос, не было ничего плохого в коде выше. Я нашел ошибку в библиотеке FTP-сервера. Он также использовал 512-байтовый буфер, и только запись этого буфера была FULL. Таким образом, второй буфер, который был частично заполнен, никогда не записывался во входящий файл. Я исправил код библиотеки FTP и все хорошо!