Страница: 1 |
Страница: 1 |
Вопрос: перейти на строку и записать текст, как сделать?
Добавлено: 19.05.06 00:55
Автор вопроса: ZXC
Есть файл, надо перейти на определённую строку ( номер строки я знаю) и затереть её и записать свой текст, как сделать? пробовал в массив, но чот не получилось :(
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
Padre
ICQ: 346632205
Вопросов: 25
Ответов: 215
Web-сайт:
Профиль | | #1
Добавлено: 19.05.06 01:48
Может быть вот это поможет:
Номер ответа: 2
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #2
Добавлено: 19.05.06 03:46
Правильным путем идешь товарищЪ!
Поэтапно это будет выглядеть примерно так:
- Используя System.IO.TextReader.ReadLine получаешь массив строк (для VS 2005 это несколько проще)
- Затем меняешь нужную строку на свою.. Например: Lines(7) = "My New String"
- Далее через System.IO.TextWriter.WriteLine записываешь все строки обратно в файл.
Вот, собственно и все..
Номер ответа: 3
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #3
Добавлено: 19.05.06 05:23
http://forum.sources.ru/index.php?showtopic=142242
ага, тока там vb6 на .NET х.з как
у меня VS2005, можешь показать насколько проще? я пока пороюсь в MSDN, если не найду буду твой ответ ждать я щас пробовал чот не получается у меня никак, куда тут переменную с содержимым файла воткнуть?
Номер ответа: 4
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #4
Добавлено: 19.05.06 06:09
Чот не получаеться ни как EROS если нетрудно можеш показать на простом примерчике как реализовать всё это? спасибо
Номер ответа: 5
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #5
Добавлено: 19.05.06 08:43
Массив нафиг не нужен. Делаешь цикл, счетчик цикла дает тебе номера строк. Потом, как EROS говорит, Считываешь строки по одной и тут же пишешь их в новый файл, если счетчик цикла дает тебе нужную строку пишешь ее, и крутишься в цикле дальше, до конца.
Типа:
sw = New System.IO.StreamWriter(PathOUT)
sr = New System.IO.StreamReader(PathIN)
Try
For i = 1 To SizeFile/2
Str = sr.ReadLine()
If i = x Then
sw.WriteLine(mast_str)
Else
sw.WriteLine(Str)
End If
Next
Catch ex As Exception
sw.Close()
sr.Close()
End Try
Ну я б так делал.
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 19.05.06 14:54
dr.Faust
Во-первых.. откуда тебе заранее знать количество строк в файле?
Во-вторых.. Откуда взялась переменная SizeFile/2 что это? Если я правильно понимаю, то это и есть конечная величина счетчика строк? хмм.. ты этим самым преднамеренно провоцируешь возникновение ошибки! Разумеется, ты ее перехватываешь, но все же как это криво.. (имхо)
В третьих.. если уж на то пошло, то зачем записывать опять строки которые остались без изменений? Не проще ли их просто пропустить?
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 19.05.06 15:04
А я бы написал так...
"Текстовый документ.txt"
Try
Dim Lines() As String = System.IO.File.ReadAllLines(filePath)
Lines(4) = "My New string line"
System.IO.File.WriteAllLines(filePath, Lines)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error in replace line"
End Try
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 19.05.06 15:07
ZXC, это для VS 2005! в более ранних версиях это работать не будет...
Номер ответа: 9
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #9
Добавлено: 19.05.06 16:40
SizeFile/2 - Размер файла деленный на 2 - максимально возможное количество строк.
Номер ответа: 10
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #10
Добавлено: 19.05.06 16:45
Согласен, твой пример красивее.
Мучает меня только динамический массив, если файл большой - будет жрать память, хотя для PC это не проблема. Для PDA уже почти привык экономить.
Номер ответа: 11
Автор ответа:
Sergey
ICQ: 283551900
Вопросов: 1
Ответов: 74
Профиль | | #11
Добавлено: 19.05.06 18:11
Можно и не через динамический массив.
Возможно 3 варианты
1-длина новой строки меньше старой
2-длина новой строки равно старой
3-длина новой строки больше старой
2) просто вписываешь строку в нужное место.
1) вписываешь строку в нужное место а потом сдвигаешь все данные после строки сдвигаешь к началу файла на разность длины новой и старой и режиш файл нужной длины.
Пусть:
Старая строка начинается с 158 байта и длиной 5 байт
Новая строка длиной 3 байта.
Тогда в позицию пишешь 158 строку 3 байта и ее конец будет в позиции 161 байт
Читаешь в буфер X байт после старой строки (158+5) и пишешь после новой (158+3) далее читаешь после (158+5+X) X1 байт и пишеш после (158+3+X) и т.д.
3) – тоже самое что и 1 но сначала надо увеличить файл потом сдвигать в коней(начинать с конца) и в образовавшийся промежуток вписать строку.
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 19.05.06 20:00
А если файл большой, и приложение критично к памяти, то и подход должен быть другой. Например через Stream.Position...
Я пошел по самому легкому пути, предположив что у него файл небольшого размера..
А SizeFile/2... все равно я считаю, что так делать не следует...
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 19.05.06 20:11
Sergey,
А как ты планируешь найти ТО САМОЕ МЕСТО?
Как ты найдешь к примеру начало и конец 6-й строки? Ведь нам ничего, кроме номера строки неизвестно...