Почему в моем файле отсутствует свободное место при попытке открыть файл - PullRequest
1 голос
/ 19 октября 2010

Я пишу небольшой код, чтобы открыть файл. Содержимое моего файла выглядит следующим образом: длина каждой строки составляет 94 символа, а терминатор строки равен \ r и \ n

101 111111111 1111111111010190542A094101
9000000000001000000000000000000000000000000000000000000

// То же самое Работает для этого текста

101 111111111 1111111111010190608A094101
52001 1 1 CCD1 101019101019 1111000020000001 6201110000251 00000000011 1 1 0111000020000001 820000000100111000020000000000000000000000011 111000020000001 9000001000001000000010011100002000000000001000000000000

     private void mnuOpen_Click(object sender, EventArgs e)
    {
        string strFilePath = string.Empty;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.FileName = string.Empty;
        openFileDialog1.RestoreDirectory = true;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            strFilePath = openFileDialog1.FileName;
            StreamReader sr = new StreamReader(strFilePath);
            string str = string.Empty;
            str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
            sr.Close();
            if (str.Length % 94 == 0)
            {
                 //Do some thing
             }
           }

Но я не получаю ошибку, может кто-нибудь сказать, почему

Ответы [ 4 ]

2 голосов
/ 19 октября 2010

Это 94 символа, включая или исключая разрывы строк? Строка "a\r\nb" имеет длину четыре символа, а не два. Проверка длины строк на основе полного содержимого файла кажется немного хрупкой. Например, файл может заканчиваться парой \r\n или нет. Я бы предпочел читать строки отдельно и проверять усеченную длину каждой строки.

Обновление
Вы можете проверить содержимое, сопоставив его с ожидаемой длиной строки:

public static bool StringIsValid(string input, int expectedLineLength)
{
    return input.Replace("\r\n", "").Length % expectedLineLength == 0;
}

// called like so:
if (StringIsValid(str, 94))
{
   // do something
}

Это не очень точно, хотя. Допустим, мы ожидаем 4-символьные строки:

string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 4); // returns true

Это выглядит хорошо. Однако учтите это:

string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 6); // returns true

Это также возвращает true, потому что единственное, что мы проверяем, это то, что общая длина строки (после удаления разрывов строки) может быть равномерно разделена на 6 символов линий. С возможной 12-символьной строкой, но это не означает, что она фактически состоит из строк длиной 6 символов. Таким образом, лучшим подходом было бы проверить длину строк. Либо вы читаете строки по одной, проверяете их и добавляете в выходные данные, если все в порядке:

private static bool LineHasCorrectLength(string line, int expectedLineLength)
{
    return line.Length == expectedLineLength;
}

// usage:
using (StreamReader reader = File.OpenText("thefile.txt"))
{
    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        if (LineHasCorrectLength(line, 94))
        {
            // add to output
        }
    }
}

... или вы получаете все строки, проверяете длину их, а затем используете их, если они проверяют OK (в этом случае с помощью метода расширения LINQ All):

private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
    return lines.All(s => s.Length == expectedLineLength);
}

// usage:
string[] lines = File.ReadAllLines("thefile.txt");
if (LinesHaveCorrectLength(lines, 94))
{
    // do something
}

Обновление 2
Исходя из ваших комментариев, это должно работать в вашем коде (используя метод LinesHaveCorrectLength из приведенного выше примера кода, который будет возвращать true, только если все строки имеют ожидаемую длину):

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    strFilePath = openFileDialog1.FileName;
    string[] lines = File.ReadAllLines(strFilePath);
    if (LinesHaveCorrectLength(lines, 94))
    {
        // add lines to grid
    }
}

Обновление 3
Не-LINQ версия LinesHaveCorrectLength:

private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
    foreach (string item in lines)
    {
        if (item.Length != expectedLineLength)
        {
            return false;
        }
    }
    return true;
}
1 голос
/ 19 октября 2010

Моя первая попытка будет File.ReadAllLines, а потом я буду беспокоиться о длине линии.

0 голосов
/ 20 октября 2010

Это работает для меня

while (sr.Peek() >= 0)
{
  str = sr.ReadLine().Replace("\r", "").Replace("\n", "");
  length += str.Length;
}
0 голосов
/ 19 октября 2010

Вы не получаете ошибку, потому что ничего не происходит неправильно. Однако вам нужно обработать случай, когда str.Length % 94 != 0, потому что ReadToEnd будет включать в вашу строку новые строки, поэтому mod 94 не выполняет эту работу. Альтернативой было бы прочитать каждую строку (с ReadLine) и проверить длину. ReadLine удаляет символы новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...