Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.188.16] |
|
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу!
Есть текстовый файл data.txt, в котором в строчку записано 5 символов: "12345". Все, ничего там больше нет и не нужно. Есть такой простейший код (проще НЕ смог придумать): #include <stdio.h> void main( void ) { char ch = 'A'; FILE* f = fopen( "data.txt", "r+" ); fputc( ch, f ); fclose( f ); } открываем текстовый файл в режиме чтения-записи и пишем на 1ую файловую позицию букву 'A', т е 'A' заменяет 1 в файле. В итоге data.txt = "A2345" Все отлично! ---------------------- А теперь делаем так: #include <stdio.h> void main( void ) { char ch; FILE* f = fopen( "data.txt", "r+" ); ch = fgetc( f ); ch = fgetc( f ); ch = 'A'; fputc( ch , f ); fclose( f ); } т е я хотел вместо '3' записать букву 'A', но НЕ вышло, файл НЕ изменился и остался "12345". Но почему???) ведь в программе два раза считали символы из файла, это '1', '2', таким образом переместив файловый указатель на позицию ПЕРЕД символом '3' и затем попытка затереть '3' буквой 'A', но ничего не происходит...Ведь '1' легко перезаписалась буквой А, а вот тройка не хочет... а почему не работает?) |
Сообщ.
#2
,
|
|
|
Если ты файл и читаешь, и пишешь в него, то эти операции нужно отделять сбросом буферов. Если этого не сделать, операция записи после чтения или наоборот вернут состояние ошибки. Простейший способ сбросить буферы — seek()нуть. Можно даже просто с нулевым смещением относительно текущей позиции, этого будет достаточно.
|
Сообщ.
#3
,
|
|
|
Qraizer, снимаю шляпу , все заработало, как только сделал так, как ты сказал:
ch = fgetc( f ); fseek( f, 0, SEEK_CUR ); ch = 'A'; зы: сколько прожок написал с этими файлами и не знал этого нюанса, надо же...ну, ладно) |