Member 13151067 Ответов: 2

Как сортировать записи в двоичном файле на языке C# ?


Я пытаюсь отсортировать записи после записи их в текстовый файл с помощью binary writer, но программа сортирует только от 0 до 9, Когда я ставлю id=10 программа считает его 1 и ставит его после 1
это код, где я пишу, сохраняю и сортирую

Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
{
    BinaryWriter bw = new BinaryWriter(File.Open(Class1.filename, FileMode.Open, FileAccess.Write));
    int length = (int)bw.BaseStream.Length;

    if (length == 0)
    {
        bw.Write("ID :" + int.Parse(textBox2.Text));
        textBox3.Text = textBox3.Text.PadRight(9);
        bw.Write("Name :" + textBox3.Text.Substring(0, 9));

        length += Class1.rec_size;
    }
    else
    {
        bw.BaseStream.Seek(length, SeekOrigin.Begin);
        bw.Write("ID :" + int.Parse(textBox2.Text));
        textBox3.Text = textBox3.Text.PadRight(9);
        bw.Write("Name :" + textBox3.Text.Substring(0, 9));
    }

    textBox2.Text = textBox3.Text  = "";
    MessageBox.Show("Data is saved Successfully");

    bw.Close();

    string inFile = Class1.filename;
    string outFile = Class1.filename;

    var contents=File.ReadAllLines(inFile);
    Array.Sort(contents);
    File.WriteAllLines(outFile, contents);
}

[no name]

Поскольку вы сортируете строки, это ожидаемое поведение. Если вам нужна числовая сортировка, вам нужно преобразовать строку, которую вы пытаетесь отсортировать, в число.

Member 13151067

Как я могу отсортировать его числовой сортировкой?

Afzaal Ahmad Zeeshan

Преобразуйте это число в целое число вместо строки.

Alan N

Другие дали вам хорошие идеи для сортировки числовых строк.
Что-то, что не было упомянуто, заключается в том, что BinaryWriter записывает в файл строки с префиксом длины. Такие файлы могут неправильно считываться с помощью файла.ReadAllLines и, вероятно, не будет правильно отображаться в блокноте. Чтобы создать чистый текстовый файл, вы должны использовать System.IO.StreamWriter.

2 Ответов

Рейтинг:
12

Jochen Arndt

Вы должны отформатировать числа с фиксированной длиной и ведущими нулями, чтобы их можно было отсортировать как текст.

Одним из вариантов является использование Типа int32.Метод ToString (String) (System)[^]:

bw.Write("ID :" + Int32.Parse(textBox2.Text).ToString("D11"));

Но с моей точки зрения ваш код не записывает строки в файл так что File.ReadAllLines вернет массив только с одной строкой. Или я что-то упустил?


Рейтинг:
1

OriginalGriff

Когда вы сравниваете строки, сравнение работает, рассматривая каждый символ один за другим, пока не найдет один символ, который не является одинаковым в обеих строках. весь результат сравнения затем основан на разнице между этими двумя символами.
Таким образом, при сортировке строк, содержащих числовые значения, порядок сортировки:

1
10
11
12
13
...
18
19
2
20
21
...

Чтобы правильно сравнить числовые значения, вам нужно либо заполнить все числа нулями, чтобы они были одинаковой длины при записи файла:
00001
00002
00003
...
00009
00010
00011
...
Или разберите строковое значение на число и сравните их, используя int.Попробуйте проанализировать соответствующую подстроку из файла.