На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> запись символа в текстовый файл , Си (С89 или С90 не знаю, но точно кто-то из них!)
    Всем хай! Сходу к делу!

    Есть текстовый файл data.txt, в котором в строчку записано 5 символов: "12345". Все, ничего там больше нет и не нужно.

    Есть такой простейший код (проще НЕ смог придумать):
    ExpandedWrap disabled
      #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"
    Все отлично!

    ----------------------
    А теперь делаем так:
    ExpandedWrap disabled
      #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' легко перезаписалась буквой А, а вот тройка не хочет...

    а почему не работает?)
      Если ты файл и читаешь, и пишешь в него, то эти операции нужно отделять сбросом буферов. Если этого не сделать, операция записи после чтения или наоборот вернут состояние ошибки. Простейший способ сбросить буферы — seek()нуть. Можно даже просто с нулевым смещением относительно текущей позиции, этого будет достаточно.
        Qraizer, снимаю шляпу :yes: , все заработало, как только сделал так, как ты сказал:

        ExpandedWrap disabled
              ch = fgetc( f );
           
              fseek( f, 0, SEEK_CUR );
           
              ch = 'A';


        зы: сколько прожок написал с этими файлами и не знал этого нюанса, надо же...ну, ладно)
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0226 ]   [ 17 queries used ]   [ Generated: 26.04.24, 17:46 GMT ]