|
|
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Т.е. имеем: файл, состоящий из строк. Мне нужно: найдя какую-либо определенную строку, изменить её значение. Как это можно сделать без перезаписи файла? Для этих целей использую VC++6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:24 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
если не менять саму строку, то используй fseek, size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:59 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
А как мне файл открыть (с каким модификатором fopen("file.txt", "a+w"))? А строку мне менять как раз надо (которую нашел). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 19:06 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Serega128А как мне файл открыть (с каким модификатором fopen("file.txt", "a+w"))? А строку мне менять как раз надо (которую нашел). Для того, чтобы изменить строку в файле не перезаписывая его полностью, надо быть уверенным, что длины считанной строки и записываемой строки равны. Иначе можно затереть что-то важное (типа как при работе с массивами через указатели: выход за границы массива допустим (остается на совести кодировщика), но к чему он приведет - неизвестно). В твоем конкретном случае надо сделать так (только принципы, без кода): 1. Открыть файл на чтение-запись; 2. Найти позицию первого символа искомой строки в файле, запомнить ее; 3. Считать строку,запомнить ее длину; 4. Провести изменения строки, проверить длину; 5. Если длина строки уменьшилась - дополнить пробелами, если увеличилась - выдать сообщение об ошибке; 6. Перейти на запомненную позицию в файле; 7. Провести запись в файл и, если необходимо, повторить п.п.2-7 8. По окончании всех работ с файлом - закрыть его :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 07:28 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Никак не сделать без перезаписи файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 18:14 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
MasterZivНикак не сделать без перезаписи файла. Почему нельзя без перезаписи? Вроде бы можно, только здесь проблема с размером строки: если она больше изменяемой, тогда надо перезаписывать файл (или портить начало следующей строки), если меньше- то остается мусор. Если все строки одинаковой длины-тогда это сделать просто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 10:04 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Предпологается, что длинна строки одинакова (и новой и старой). Можно пример кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 10:28 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
1) Ищешь "определенную" строку в файле 2) Встаешь в файле на начало этой строки (перед чтением каждой следующей строки запоминаешь позицию в файле (например, в переменной long beg_pos), если строка - искомая - fseek(f,-(tek_pos-beg_pos),SEEK_CUR), где tek_pos - текущая позиция в файле (fgetpos(f,&tek_pos))) 3) Пишешь свою строку (fwrite(str,sizeof(str),1,f)) Вроде так (при условии, что sizeof(str) - старой и новой строки совпадают- иначе будет либо затирание следующей строки, либо оставаться "мусор" от старой)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 13:05 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
У меня не получилось. Как открыть файл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 13:19 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 10:00 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Alex_VC1) Ищешь "определенную" строку в файле 2) Встаешь в файле на начало этой строки (перед чтением каждой следующей строки запоминаешь позицию в файле (например, в переменной long beg_pos), если строка - искомая - fseek(f,-(tek_pos-beg_pos),SEEK_CUR), где tek_pos - текущая позиция в файле (fgetpos(f,&tek_pos))) 3) Пишешь свою строку (fwrite(str,sizeof(str),1,f)) Вроде так (при условии, что sizeof(str) - старой и новой строки совпадают- иначе будет либо затирание следующей строки, либо оставаться "мусор" от старой)... Алекс, не это ли можно выразить словосочетанием "перезапись файла", а ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 10:04 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
И еще. При записи в файл в произвольном месте оставшаяся часть в общем случае стирается. Для того, чтобы она не стиралась , нужно пользоваться не C-шными функциями ввода-вывода, а низкоуровневыми или функциями WIN API. А там понятия строки не существует вообще. С-шный же ввод -вывод - это потоковый ввод-вывод, последовательный, там практически нет произвольного доступа. Так что самый просто способ сделать это - считать файл, разобрать по строкам (это можно и в процессе чтения сделать - fgets), изменить нужную строку(и) и записать файл обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 10:15 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Алекс, не это ли можно выразить словосочетанием "перезапись файла", а ? Ну, под перезаписью файла я понимаю создание НОВОГО файла, с последующим копированием содержимого предыдущего. В данном случае файл заново не создается, изменяются только его данные (дата создания остается прежней). Ну а способов как это сделать несколько... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 10:36 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
Alex_VCНу, под перезаписью файла я понимаю создание НОВОГО файла, с последующим копированием содержимого предыдущего. В данном случае файл заново не создается, изменяются только его данные (дата создания остается прежней). Ну а способов как это сделать несколько... Если ты подумаешь[\b], то сможешь понять, что это и есть создание нового[\b] файла, но только с тем же названием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2004, 10:15 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
это уже тонкие материи :-) если идентифицировать файл по внешним признакам (имя, занимаемые кластеры, inode) то это будет прежний файл. Если же идентифицировать файл по его содержимому, то каждое изменение информации файла будет приводить к уничтожению старого и появлению нового. но ведь все идентифицируют по внешним признакам :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2004, 10:21 |
|
||
|
Как изменить строчку в файле?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Alex_VCНу, под перезаписью файла я понимаю создание НОВОГО файла, с последующим копированием содержимого предыдущего. В данном случае файл заново не создается, изменяются только его данные (дата создания остается прежней). Ну а способов как это сделать несколько... Если ты подумаешь[\b], то сможешь понять, что это и есть создание нового[\b] файла, но только с тем же названием. Но ведь у файла есть дата создания и дата последней модификации, дата последнего доступа и т.п. При создании нового файла дата создания будет установлена в момент его создания (как, впрочем, и модификации). При изменении данных файла, изменяется дата модификации, дата создания остается неизменной. (Мона, конено, и у вновь созданного файла установить эту дату...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2004, 10:28 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32827915&tid=2033987]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 387ms |

| 0 / 0 |
