Удаление строки из файла

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Удаление строки из файла

Сообщение AnarCky » 26.12.2006 (Вт) 16:45

Есть фай с примерно таким содержанием:

Аs - 15.14032
Ds - 23. 12830
Вi - 49.234890
S - 32.35248
...
И так далее в том же духе примерно 90 строк.

У меня есть следующий код:

Код: Выделить всё
    Private Sub ButtonsClicks(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click, Button4.Click, Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click, Button10.Click, Button11.Click, Button12.Click, Button13.Click, Button14.Click, Button15.Click, Button16.Click, Button17.Click, Button18.Click, Button19.Click, Button20.Click, _
                                                                                            Button21.Click, Button22.Click, Button23.Click, Button24.Click, Button25.Click, Button26.Click, Button27.Click, Button28.Click, Button29.Click, Button30.Click, Button31.Click, Button32.Click, Button33.Click, Button34.Click, Button35.Click, Button36.Click, Button37.Click, Button38.Click, Button39.Click, Button40.Click, _
                                                                                            Button41.Click, Button42.Click, Button43.Click, Button44.Click, Button45.Click, Button46.Click, Button47.Click, Button48.Click, Button49.Click, Button50.Click, Button51.Click, Button52.Click, Button53.Click, Button54.Click, Button55.Click, Button56.Click, Button57.Click, Button58.Click, Button59.Click, Button60.Click, _
                                                                                            Button61.Click, Button62.Click, Button63.Click, Button64.Click, Button65.Click, Button66.Click, Button67.Click, Button68.Click, Button69.Click, Button70.Click, Button71.Click, Button72.Click, Button73.Click, Button74.Click, Button75.Click, Button76.Click, Button77.Click, Button78.Click, Button79.Click, Button80.Click, _
                                                                                            Button81.Click, Button82.Click, Button83.Click, Button84.Click, Button85.Click, Button86.Click, Button87.Click, Button88.Click, Button89.Click, Button90.Click, Button91.Click, Button92.Click, Button93.Click, Button94.Click, Button95.Click, Button96.Click, Button97.Click, Button98.Click, Button99.Click, Button100.Click, _
                                                                                            Button101.Click, Button102.Click, Button103.Click
        Dim oAtMass As System.IO.StreamReader, owAtMass As System.IO.StreamWriter
        Dim objBut As Button
        Dim str1, str2, str3, str4, str5, str6 As String
        objBut = sender
        objBut.Text = str3
        If System.IO.File.Exists("Разное\AtMass.txt") Then
            oAtMass = System.IO.File.OpenText("Разное\AtMass.txt")
            str1 = oAtMass.ReadLine()
            str2 = str1.Substring(0, 2)
            str2.TrimEnd(" ")
            If String.Equals(str2, str3) Then
                str1.Substring(5)
                rtxtN.Text = str4
                rtxtN.Text = str4 & str1
            Else

            End If
        Else
            MessageBox.Show("К сожалению файл не найден.", "Ошибка", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error, _
                            MessageBoxDefaultButton.Button1)
        End If
    End Sub


Загвоздка в том, что если str2 b str3 не равны, то надо читать следующую строку. А как это сделать я не знаю. Есть вариант, что надо удалить первую строку и вписать ее в конец файла, но опять же как :?: Подскажите пожалуйста.

Спасибо!
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 26.12.2006 (Вт) 18:59

Поподробнее. Ни из приведенного примера, ни из твоего описания ничего толком понять нельзя.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 26.12.2006 (Вт) 20:41

У меня в файле AtMass.txt записана построчно некоторая информация (см выше). Каждому хим. элементу соответствует своя атомная масса.
При нажатии на Кнопка3 - Кнопка103 по сценарию прога должна находить строку которая соответствует тексту на кнопке, затем вырезать оттуда подстроку с 5ого символа и до конца строчки (т.е. все цифры) и наконец записать эту строку в rtxtN. Для этого я открываю файл последовательного доступа, а затем читаю построчно методом ReadLine. Если подстрока из 2х символов (str2), вырезанная из читаемой строчки(str1), и текст на кнопке (str3) равны, то дальше как и планировалось. Там я еще проверяю есть ли в подстроке str2 пробелы (некоторые хим символы состоят из 1ого или 2х знаков). Если да, то от пробелов избавляемся.
А если str2 и str3 не равны, то нужно переходить к следуюущей строчке. Проблема начинается именно отсюда. Как заставить прогу читать 2ю строчку? Один вариант я уже предлагал (см выше). На его реализации у меня все и застопорилось.
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 26.12.2006 (Вт) 21:02

Код страшен - лучше программно добавляйте кнопки в цикле, чем прописывать столько кнопок на обработчик.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.12.2006 (Ср) 8:25

Так читай их в цикле... строки то


З.Ы. [Offtop]103 кнопки опять же за короткий промежуток времени напомнили об 48 утюгах на подоконнике...[/Offtop]
Весь мир матрица, а мы в нем потоки байтов!

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 27.12.2006 (Ср) 18:58

gaidar
Все поздняк метаться. Щас уже сделанного жалко. :D
К тому же кнопки прописывал не я а Excel, автозаполнением. :) Я конечно мазохист но не настолько.
Ну и в Бэйсике код выглядит посимпатичнее. Слабое утешение, но все-таки.

Я кажется уже нашел другое решение. Щас протестим и я скажу.
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 27.12.2006 (Ср) 19:54

Не получается. Я переделал код следующиим образом:

Код: Выделить всё
    Private Sub ButtonsClicks(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click... - ...Button103.Click
        Dim oAtMass As System.IO.StreamReader, owAtMass As System.IO.StreamWriter
        Dim objBut As Button
        Dim str1, str2, str3, str4, str5, str6 As String
        Dim int, int2, int3 As Integer
        Dim sng1, sng2 As Single
        objBut = sender
        objBut.Text = str3
        If System.IO.File.Exists("Разное\AtMass.txt") Then
            oAtMass = System.IO.File.OpenText("Разное\AtMass.txt")
            str1 = oAtMass.ReadToEnd()
*          int2 = str1.IndexOf(str3)
            str2 = str1.Substring(int2 + 5, 9)
            sng1 = CSng(str2)
            rtxtN.Text = str4
            rtxtN.Text = str4 & sng1
        Else
            MessageBox.Show("К сожалению файл не найден.", "Ошибка", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error, _
                            MessageBoxDefaultButton.Button1)
        End If
        oAtMass.Close()
    End Sub


Но он выдает следующее сообщение (см приложение). Останавливается на строчке кода возле которой стоит звездочка. Ну и честно говоря я не совсем понимаю, что значит "Строковая ссылка не установлена к требованию строки." Подскажите пожалуйста...
Вложения
temp4.png
temp4.png (10.45 Кб) Просмотров: 1186
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.12.2006 (Ср) 20:00

И не будешь понимать, пока не начнёшь переводить правильно, а не так...
А System.ArgumentNullException тоже ни о чём не говорит, да? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 27.12.2006 (Ср) 20:57

Начну с конца:
Почему же, говорит. Исключение класса Ноль. Еще че-то про аргумент было. Не думай это не дословный перевод. :D Я действительно читал про исключения их классы и прочее... Но на этом мои познания в области ошибок заканчиваются. Оссобенно в той части, где говорится про их устранение.
Технический перевод в 9ом классе не дают, а самому перевести со смыслом не получается. И в конце концов... Стал бы я сюда писать если бы все понимал? Вот я тоже думаю...
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.12.2006 (Чт) 8:16

Нды...

Код: Выделить всё
int2 = str1.IndexOf(str3)


В этом месте у тебя str3 ничем не инициализирована, так что совершенно непонятно, чего же ты пытаешься найти. Вот и получается ArgumentNullException, ибо str3 есть Nothing (оно же NULL).

Да и эта пара строк выглядит странно:

Код: Выделить всё
objBut = sender
objBut.Text = str3


опять же Nothing присваиваем
Весь мир матрица, а мы в нем потоки байтов!

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 28.12.2006 (Чт) 20:46

А почему "Cast from string "1.0079470" to type 'Single' is not valid."?
И как это лечится
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 28.12.2006 (Чт) 20:53

Теперь все работает как и хотел, но для Integer`а. Хотелось бы для Single`а. Подскажите пожалуйста в чем проблемса (см выше).
Может надо не в Single, а Double?..
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.12.2006 (Пт) 8:17

Предполагаю, что при попытке преобразовать 1.0079470 в Single была не понята точка в чачестве разделителя целой и дробной частей. Это может быть в том случае, когда тааковым разделителем является запятая. Лечится это в зависимости от того чего тебе хочется.
Весь мир матрица, а мы в нем потоки байтов!

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 29.12.2006 (Пт) 10:42

Да, я уже решил проблему. Как ты и говоришь. Заменил все запятыми и теперь все работает.
Но все равно спасибо!
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 29.12.2006 (Пт) 17:48

Теперь все работает как и хотел, но для Integer`а. Хотелось бы для Single`а. Подскажите пожалуйста в чем проблемса (см выше).

Это зависит от региональных настроек компа.
Например если региональные настройки англиские тогда целые и десятичнчные разделяются точкой.
Последний раз редактировалось temur 29.12.2006 (Пт) 18:05, всего редактировалось 1 раз.

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 29.12.2006 (Пт) 18:01

А если str2 и str3 не равны, то нужно переходить к следуюущей строчке. Проблема начинается именно отсюда.

Во первых как отмелил !Viper! str3 нигде не инициализируется
Во вторых к примеру (str3 = значение ) есть два варианта считать следующую строку

Еще раз коментарий !Viper!-а
Так читай их в цикле... строки то


Код: Выделить всё
Do While oAtMass.EndOfStream
           If String.Equals(str2, str3) Then
                str2 =  str1.Substring(0, 2)
                rtxtN.Text = str4
                rtxtN.Text = str4 & str1
                Exit Do
            Else
                 str1 = oAtMass.ReadLine()
                 str2 = str1.Substring(0, 2)
            End If
Loop


Второй (Not recomended)


Код: Выделить всё
:equals1
If String.Equals(str2, str3) Then
                str2 = str1.Substring(0,2)
                rtxtN.Text = str4
                rtxtN.Text = str4 & str1
Else
                 str1 = oAtMass.ReadLine()
                 str2 = str1.Substring(0, 2)
GoTo equals1
End If
Последний раз редактировалось temur 05.02.2007 (Пн) 12:14, всего редактировалось 4 раз(а).

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 30.12.2006 (Сб) 7:19

temur, чей-то какой-то странный вариант кода ты привел.

Вот например, что делает это:

Код: Выделить всё
Do While oAtMass.oAtMass
?

а это:

Код: Выделить всё
str1.Substring(5)
?

а здесь на кой две строки:

Код: Выделить всё
rtxtN.Text = str4
rtxtN.Text = str4 & str1
?

З.Ы. А второй вариант закрась и никому не показывай ваще никогда.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

    TopList