Запись в фал

Тема в разделе "LANGS.C", создана пользователем BreakHeart, 26 фев 2009.

  1. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    Подскажите плз. вот есть функция по поиску определенной строки в файле:
    Код (Text):
    1. bool FindStringInFile(wchar_t * InFile,wchar_t * InString,int strLen)
    2. {
    3.     FILE* pif;
    4.     wchar_t * current_str = new wchar_t[strLen];
    5.     memset(current_str,0,strLen);
    6.  
    7.     if(!(pif=_wfopen(InFile, L"r")))
    8.     {
    9.         printf("Open log_file failed.\n");
    10.         return false;
    11.     }
    12.  
    13.     while(!(feof(pif)))
    14.     {
    15.         fgetws(current_str, strLen+1,pif);
    16.  
    17.         if (ferror(pif))
    18.         {
    19.             printf("error");
    20.             return false;
    21.         }
    22.  
    23.  
    24.         if ((wcsstr(current_str,InString))!=NULL)
    25.         {
    26.             fclose(pif);
    27.             return true;
    28.         }
    29.     }
    30.     fclose(pif);
    31.  
    32.     return false;
    33. }
    как ее можно преобразовать так чтобы она еще записывала в файл после найденной строчки другую строчку?
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    _wfopen(, L"rw") + fputws?
     
  3. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    а эта комбинация не потрет то что находится ниже этой строчки?
     
  4. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    я вот так попробовал, но fputws возвращает ошибку:
    Код (Text):
    1. FILE* pif;
    2.     wchar_t * current_str = new wchar_t[strLen];
    3.     memset(current_str,0,strLen);
    4.  
    5.     if(!(pif=_wfopen(InFile, L"a+")))
    6.     {
    7.         printf("Open log_file failed.\n");
    8.         return false;
    9.     }
    10.  
    11.     while(!(feof(pif)))
    12.     {
    13.         fgetws(current_str, strLen+1,pif);
    14.  
    15.         if (ferror(pif))
    16.         {
    17.             printf("error");
    18.             return false;
    19.         }
    20.  
    21.  
    22.         if ((wcsstr(current_str,InString))!=NULL)
    23.         {
    24.             fputws(L"\nснова\n",pif);
    25.             fclose(pif);
    26.             return true;
    27.         }
    28.     }
    29.     fclose(pif);
    30.  
    31.     return false;
    в чем я ошибся?
     
  5. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    вроде вставляет но если ставить после первой строчки то он подтирает вторую а как можно сделать так чтобы вставлялась еще одна строчка?
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Вставить в середину файла, так чтобы он раздвинулся, нельзя. Нужно перезаписывать от места вставки до конца файла.
     
  7. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    а как это приблизительно сделать не подскажете?
     
  8. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Приблизительно читаешь блок в память, потом точно пишешь то что надо, потом приблизительно столько, сколько влезет в оставшееся от ранее прочитанного место. И дальше по кругу.

    Или просто всё подряд в новый файл.
     
  9. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    чет я подумал и понял что мне как-то трудновато этот алгоритм дается....подскажите плз пару строк...вот я нашел нужную строчку, как мне скопироть то что было до нее в новый файл, потом записать то что мне нужно и скопировать то что идет дальше?
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    BreakHeart
    не проще ли прочесь все содержимое файла в буффер, далее проделать над ним эту вставку строки (ну, что тебе там нужно, ессно, при необходимости расшырив его путем его реаллокации), и далее записать полностью все эти данные в файл?

    ps: на с++ с STL можешь взять std::vector и не париться с перевыделениями памяти.
     
  11. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    наверно я покажусь очень глупым но как это все сделать?